lhywk 님의 블로그

[Dreamhack] WinDbg Exercise 2 본문

Reversing/Dreamhack

[Dreamhack] WinDbg Exercise 2

lhywk 2025. 12. 15. 02:10

문제

"Correct!"를 출력하는 입력을 찾아주세요! 해당 입력이 문제의 플래그가 됩니다.

문제 풀이

해당 바이너리를 실행해 보면 입력을 받은 후 입력이 올바르면 Correct, 틀리면 Wrong을 출력해요.

 

1. 정적 분석

main 디컴파일

main 함수를 디컴파일 해볼게요.

sub_14001970( )은 printf, sub_140019D0( )은 scanf와 대응되요.

v9에 32바이트 만큼 입력 받고 sub_140001000( )의 반환값과 일치하면 Correct 일치하지 않으면 Wrong을 출력해요.

sub_140001000( ) 함수를 분석해보면 되겠네요.

sub_140001000 디컴파일

그런데.. 연산이 너무 복잡해요.

900줄의 연산이 수행되기 때문에 분석을 하고 직접 역연산을 하기는 어렵습니다.

바이너리를 실행해서 이 함수의 반환값을 얻는 방향으로 문제를 풀이하는게 좋을거 같아요.

동적 분석을 하기 전 이 함수의 상대 가상 주소를 알아냅시다.

상대 가상 주소 확인

Edit -> Segment -> Rebase program -> value값 0으로 설정

함수를 실행했을때의 상대 가상 주소는 1A7B, 그 다음 명령어는 1A80이네요.

 

2. 동적 분석

우리는 32번 반복해서 반환하는 값을 알아내면 플래그를 획득할 수 있어요.

WinDbg를 사용해서 간단한 스크립트를 작성해서 풀어봅시다.

WinDbg 및 바이너리 실행

WinDbg를 실행하여 해당 바이너리를 올립니다.

lm : List Loaded Modules의 약자로 메모리에 로드된 모듈들의 목록을 가상 주소와 함께 출력

lm 명령어로 Image Base 주소를 확인할게요.

0x7ff629610000으로 되어 있어요.

아까 sub_140001000( ) 다음 명령어의 주소가 0x1A80 이었어요.

이 주소를 중단점으로 설정하고 실행하면 함수의 반환값이 rax에 있을 것이고 크기는 1바이트이므로 al 레지스터의 값을 확인해야 해요.

명령어 작성

bp 00007ff6`29610000+0x1A80 : Imagebase + 상대 가상 주소를 더한 가상 주소로 중단점 설정

".printf \"%c\", @al; g" : al의 레지스터 값을 출력하고 ;을 사용하여 명령어 나열, g로 다시 한번 중단점까지 실행

이렇게 구성하면 반복문을 32번 돌면서 al의 레지스터 값이 1바이트씩 출력되면서 반환값을 확인할수 있어요.

실행

g을 입력하여 실행합니다.

아무값이나 입력해볼게요.

플래그 획득

총 32바이트의 플래그를 획득합니다.

'Reversing > Dreamhack' 카테고리의 다른 글

[Dreamhack] rev-basic-6  (0) 2025.12.17
[Dreamhack] rev-basic-4  (1) 2025.12.16
[Dreamhack] WinDbg Exercise 1  (0) 2025.12.15
[Dreamhack] rev-basic-3  (0) 2025.12.13
[Dreamhack] patch  (1) 2025.12.13