해보자고

[드림핵] Simple Patch Me 본문

리버싱

[드림핵] Simple Patch Me

초코맛동산 2025. 4. 21. 17:00

 

# 문제

문제 링크 | https://dreamhack.io/wargame/challenges/669

 

Simple Patch Me

Description 이 문제는 실제 시간으로 365일이 흐르면 플래그를 출력하는 프로그램이 주어집니다. 프로그램을 패치하여 플래그를 획득하세요! 플래그 형식은 DH{...} 입니다. Reference Ghidra Roadmap

dreamhack.io

이 문제는 실제 시간으로 365일이 흐르면 플래그를 출력하는 프로그램이 주어집니다.
프로그램을 패치하여 플래그를 획득하세요!

(일단, 글 시작에 앞서 툴 사용법을 공부 하지 않아 IDA 갔다가, 기드라 갔다가, GDB갔다가 결국은 깨져버린 플래그가 되었으나... 저의 방식대로 하시면 플래그는 나오는 듯요..)

 

 

1. 실행 흐름 훑어보기 

 

 

먼저, flag가 나올 부분을 string 검색을 통해 찾아주었고, flag 를 출력하기 까지의 실행 흐름을 IDA의 그래프뷰로 이해했습니다. 

 

 

 

flag가 출력되기 전에 cmp로 eax(cs:dword_40404C 참조 값)와 8789(0x2237)를 비교하여 8759보다 작거나 같기전까지 loc_4012A1으로 분기(8760시간 = 365일, 즉 365일을 넘어야만 flag가 보이는 함수로 분기) 한다. 이는 아래의 디컴파일된 함수들을 통해 이해할 수 있다. 

 

 

FUN_004010a0 함수는 3,600초(1시간)를 가만히 기다리고 1시간이 지나면 DAT_0040404c 가 1씩 상승한다는 것을 알 수 있다. 

 

아무튼, 이는 사실 드림핵에서 친절하게 이런 함수야~ 하고 알려줘서 굳이 이해할필요까진 없지만...? 우리가 어떤 값을 패치하는데 힌트는 될 수 있다. 다양한 패칭을 할 수 있지만 나는 365일 전에 flag가 반환되도록 JBE 명령어를 JA 명령어로 패칭하기로 했다. 

 

JBE(Jump if (unsigned) below or equal): 비교된 두 값 중 첫 번째 값이 두 번째 값보다 작거나 같으면 점프가 발생. 

-> 어셈블리상 첫 번째 값은 cs:dword_40404C 참조 값, 두 번째 값은 365일. 

JA( Jump if Above ): 첫 번째 값이 두 번째 값보다 크면 점프.

-> whlie문을 한 번도 안 돌고 바로 건너뛰기! 

 

 

2. 패칭하기

 

 

(좌) 패칭전, (우) 패칭후

 

 

 

그런데.. 이제 깨져버린..

 

하지만.. 그렇지만,, 이거 플래그 맞는 듯..!  

'리버싱' 카테고리의 다른 글

[드림핵] Easy Assembly  (0) 2025.04.24
[CodeEngn] Malware L07  (0) 2025.04.22
[드림핵] Small counter  (0) 2025.04.10
[드림핵] simple crack me  (0) 2024.11.19
[드림핵] Secure Mail  (0) 2024.11.14