[DreamHack] [Reversing] rev-basic-7

image.png

문제에는 해당 바이너리를 분석하라고 되어있는데, 막상 첨부파일엔 .exe파일밖에 없다.

따라서, IDA를 이용해서 정적 분석을 해보고, 안되면 OllyDBG로 동적 분석을 진행하겠다.

main()함수의 내용이다.

사실 rev-basic-5랑 겉으로 보기에는 구조가 똑같아 보인다.

어셈블리를 완벽하게 해석하진 않았지만, 문자열들과 aInput 등이 보인다.

눈으로 당장 확인 가능한 문자열이 Input, %256s, Correct, Wrong 등이 있는 것을 보아,

Input을 통해 어떤 값을 입력 받고,

그 값이 올바른 값이면 Correct, 아니면 Wrong을 출력하는 프로그램이라고 유추가 가능하다.

image.png

이번에도 rev-basic-6와 같이 sub_140001000() 함수를 확인해 보겠다.

image.png

__int64 __fastcall sub_140001000(__int64 a1)
{
    int i; // [rsp+0h] [rbp-18h]

    // i를 0부터 30(0x1F-1)까지 반복 (총 31회)
    for (i = 0; (unsigned __int64)i < 0x1F; ++i)
    {
        // 입력값(a1)의 i번째 바이트를 (i & 7)만큼 비트 좌회전(ROL1, 8비트)
        // 그 결과와 인덱스 i를 XOR하여, byte_140003000[i]와 비교
        // __ROL1__(*(_BYTE *)(a1 + i), i & 7):
        //   - 8비트(1바이트) 값(*(_BYTE *)(a1 + i))을 (i & 7)비트만큼 좌회전
        // i ^ ROL1(입력[i], i&7) != byte_140003000[i] 이면 실패
        if ( (i ^ (unsigned __int8)__ROL1__(*(_BYTE *)(a1 + i), i & 7)) != byte_140003000[i] )
            return 0;
    }
    return 1; // 모든 조건 통과 시 성공
}

입력 및 검증 구조

핵심 연산