본문 바로가기
Reversing/드림핵

[Dreamhack] rev-basic-3

by L3m0n S0ju 2021. 3. 30.

 

 

 


 

문제 파일을 다운로드 받고 IDA Pro 7.5를 실행하면 위 그림과 같이 디스어셈블할 수 있다. Correct를 출력하기 쉬해서는 sub_140001000(v4) 함수가 참을 반환해야 Correct가 출력된다.

 

 


 

 

sub_140001000 함수로 들어가서 코드를 분석하겠다.

 

for ( i = 0; (unsigned __int64)i < 0x18; ++i )    ->    24번 반복한다.

 

 

 

if ( byte_140003000[i] != (i ^ *(unsigned __int8 *)(a1 + i)) + 2 * i ) 

      return 0i64;

 

 byte_140003000[i] 과 ((i ^ *(unsigned __int8 *)(a1 + i)) + 2 * i )가 같으면 if 문이 거짓이 되어 return 0; 을 실행하지 않는다.

 

 


 

위 그림은 x64dbg 툴을 사용하여 이전에 설명한 byte_140003000에 저장된 문자열을 찾을 것이다. x64dbg의 CPU 창에서 해당 주소 값에 마우스 우클릭하여 덤프에서 따라가기를 클릭하면 해당 위치로 이동할 수 있다. 해당 위치로 가면 24개의 Hex 값이 존재한다. 따라서 현재 조건식에서 입력할 문자열을 제외한 나머지 값들을 모두 알고 있으므로 입력할 문자열을 추출하겠다.

 

 


#include <stdio.h>
#include <string.h>

void main()
{
    char buf[] ={
        0x49, 0x60, 0x67, 0x74, 0x63, 0x67, 0x42, 0x66, 0x80, 0x78, 0x69, 0x69, 0x7B, 0x99, 0x6D, 0x88,
        0x68, 0x94, 0x9F, 0x8D, 0x4D, 0xA5, 0x9D, 0x45
    };
    for (int i = 0; i < 24; i++)
    {
        buf[i] = buf[i] - i * 2;
        buf[i] = buf[i] ^ i;
    }
    printf("%s", buf);
}

 


위 C 코드는 입력할 문자열을 추출하기 위해 작성한 코드이다. 해당 코드는 xor을 두번하면 원상태로 돌아온다는 점을 이용하였다.

 

코드를 실행하면 플래그가 출력된다.

 


플래그: I_am_X0_xo_Xor_eXcit1ng

'Reversing > 드림핵' 카테고리의 다른 글

[Dreamhack] rev-basic-8  (0) 2021.04.12
[Dreamhack] rev-basic-7  (0) 2021.03.30
[Dreamhack] rev-basic-5  (0) 2021.03.30
[Dreamhack] rev-basic-4  (0) 2021.03.30
[Dreamhack] rev-basic-0  (0) 2021.03.24

댓글