[Dreamhack] simple_patch

Chris Kim·2024년 10월 13일

리버싱

목록 보기
9/10

출처: 드림핵 워게임

1. 개요

365일 뒤에 플래그를 출력해준다고 한다.
[사진]

2. 디컴파일

IDA 디컴파일
(1) 전체적인 모습을 보면 1년뒤에 보여주겠다고 하고 sleep(0xE10u)를 통해 1시간씩 sleep하고 0x40404c를 1씩 증가시키는 것을 볼 수 있다.
(2) 그럼 바이너리 패치를 통해 0x404040c0x2238 로 바로 수정해주면 될까?
(3) 안된다. 맨 밑에 sub_401196을 보면 Great...a2와 함께 인자로 받고 있는 모습이 보인다. a2는 마지막 루프에서 a2 = 40404c % 0x18을 수행해야하기 때문이다.
(4) 정확히 40404c0x2237(365*24-1)이 들어간 경우, 마지막 루프에서 수행되는 작업은 다음과 같다.

(4-1) while ( (unsigned int)dword_40404C <= 0x2237 ) 조건 통과 루프 내 구문 실행
(4-2) sleep(0xE10u); 실행
(4-3) if ( ++dword_40404C == 1 )판단 하면서 40404c 1 증가, 0x2238(365 * 24) 저장중
(4-4) if ( !(dword_40404C % 0x18u) )을 만족하므로(24시간 단위 체크) 아래 구문중 else 이하부분 실행

if ( dword_40404C == 24 )
      {
        puts("1 day has paased.");
      }
      else
      {
        a2 = dword_40404C % 0x18u;
        printf("%u days have passed.\n", a2);
      }

신기한건 이 때 0 days have passed가 출력 될 것이다. 이때 a2에 0이 저장된다는 사실을 기억하자.
(4-5) 반복 조건이 충족되지 않으므로 루프 종료 아래 구문 실행

printf("Great xD 1 year has passed! The flag is: ");
sub_401196("Great xD 1 year has passed! The flag is: ", a2);

3. gdb

자 gdb로 가서 내가 원하는 과정을 실행해보자
IDA view 기준으로 0x40127B에서 main함수가 시작되고 있다. 죽 흐름을 따라 내려가다보면
0x401376에 40404c 를 eax에 옮기고 0x2237과 비교한 뒤 조건에 따라 점프하는 어셈블리어가 있다. 여기가 반복문 조건을 점검하는 부분같다.
gdb에서 0x401376에 중단점을 걸어주고 실행하자

여기서 set *(int *)(0x40404c) = 0x2237을 해준뒤 ni로 넘어가보자
계속 넘어가다가는 sleep을 실행하므로 si로 sleep 내부에 들어간 뒤, return(함수를 실행하지 않고 종료하는 gdb 명령어)를 써주자. 아니면 1시간 기다리면 된다.

si
return
ni
c

위 순서대로 명령어를 입력해주면
아래처럼 된다.
위에서 말한것 처럼 0days...가 출력된다. 그리고 우리가 중단점을 설정해줘서 다음과 같이 나온다.
예상대로 0x40404c에 0x2238이 저장되어 있는 모습이다. 이대로 다시 c(continue)를 눌러주면 플래그가 나올것이다.

pwndbg> c
Continuing.
Great xD 1 year has passed! The flag is: DH{...}

4. 마무리

이번에는 힌트를 찾지 않고 문제를 풀 수 있어서 좋았다.
근데 사실 0x40404c를 0x2238로 바로 패치해도 플래그가 나온다.
왜냐하면 sub_401196에서는 0x40404c를 참조하기 때문이다. 사실 그냥 위에서 sleep 건너뛰고 하고 그런건 필요없다. 이러한 이유로 위에서 0x40404c가 아닌 eax를 수정하면 안된다. eax를 수정했다면 0x00이 전달 되었을 것이다. 여기선 0x2238이 전달되어야 한다.

만약 eax를 수정하면..

인자가 잘못전달되어 플래그가 깨져서 나온다. 내가 이것땜에 삽질함, 그래도 40404c 변경해야하는건 금방 찾아서 다행

다음부턴 인자가 어디서 오는지도 신경써야겠다.

profile
회계+IT=???

0개의 댓글