파일
실행 파일 하나만 주어진다.
실행 모습
프로그램의 모습은 심플하다.
입력창이 하나, Check 버튼, 그리고 밑에 Wrong이라고 써져 있다.
입력창에는 숫자만 입력 가능하다.
아무 숫자나 입력하고 Check 버튼을 누르면 이상하게도 프로그램이 그냥 종료되어 버린다.
분석
어떤 것을 해야되는지조차 아직 모르는 상태이다.
저 wrong 부분을 맞았다고 바꾸면 될 거 같은데 일단 x32dbg로 열어보자.
문자열 검색에 Correct! 문자열이 있다.
저 Correct 부분이 실행되도록 하면 될 것 같다.
API들도 보면,
GetDlgItemInt라는 함수가 입력창에 숫자를 입력한 것을 가져오는 함수인 것 같고,
SetDlgItemTextA가 Correct 문자열을 dlg에 설정하는 함수인 것 같다.
코드를 봐보자.
원하는 부분들이 한데 모여있다.
GetDlgItemInt 함수도 보이고, SetDlgItemTextA 함수도 보이고 SetDlgItemTextA 함수의 인자로 들어가는 "Correct!" 문자열도 보인다.
SetDlgItemTextA 함수를 호출하는 40107E 부분이 실행되었으면 좋겠는데,
40106C와 401071의 jmp문이 그걸 방해한다.
이 부분을 nop으로 바꾸고 실행해본다.
원하는 대로 SetDlgItemTextA 함수가 실행되어 Correct! 문자열이 나타났다.
하지만 Correct 문자열만 나왔을 뿐이지 플래그로 쓸만한 값은 안 보인다.
이렇게 푸는 게 아닌 것 같다.
그렇다면 Correct! 문자열이 나오도록 하는 어떠한 입력값이 존재하는 것 같다.
입력받은 값이 어떻게 쓰이는지 분석해 보자.
풀이
GetDlgItemInt로 얻어온 입력값을 4084D0 위치로 옮겼다. (4084D0를 memA라고 하자)
그리고 40466F 함수를 실행한다. (40466F를 funcA라고 하자)
바로 40467A를 호출한다.
406016 위치에 619060EB를 기록한다.
그리고 404689를 호출하는데 바로 아래이다. (그림에서 연두색 표시된 부분)
memA의 값을 1 증가시킨다.
ret 되고서 이 부분이 한번 더 실행된다.
결과적으로 memA의 값이 2 증가한다.
그다음, memA에 601605C7을 더한다.
그리고 404684 ~ 40468F 부분에서 memA를 또 두 번 1씩 증가하게 된다.
그다음, 익숙한 구간으로 ret 되었다.
문제의 두 개의 jmp문 중 첫 번째 jmp문을 따라가 보자.
memA를 eax로 옮겼다.
call replace.404689 부분은 눈여겨볼 부분은 없다.
그다음 부분들이 정말 중요한 부분이다.
보면, 40466F 주소에 C39000C6을 mov 하고 있다.
40466F는 funcA이다.
즉, 이 mov문을 통해서 40466F의 명령어를 replace 하는 것이다.
어떤 명령어로 고치는지 디버깅해 보자.
eax에 90을 mov 하고 있다.
90은 Nop이다.
'replace 부분' 사진에서 이 funcA함수가 두 번 호출되는 것을 볼 수 있다.
즉, 우리가 입력한 값을 가지고서 특정한 계산을 거치고 그 주소의 두 바이트 명령어를 Nop으로 replace 시키는 구조인 것이다.
그렇다면 어떤 부분을 Nop으로 바꿔야 할까?
두 번의 funcA가 실행된 후, 401071로 jmp 한다.
이 401071 명령어가 SetDlgItemTextA 함수가 실행되는 부분을 점프하게 한다.
그러므로 401071의 두 바이트 명령어를 Nop으로 바꿔서, 이 부분이 실행되도록 하면 된다.
그럼 계산을 해보자.
입력값 = x
x + 1 + 1 + 0x601605C7 + 1 + 1 = 0x401071
x + 0x601605CB = 0x401071
x = 0x401071 - 0x601605CB
x = 0x FFFF FFFF A02A 0AA6
캐리가 일어나도 상관없다.
0xA02A0AA6 + 0x601605CB = 0x 1 0040 1071
즉, 우리가 원하는 값은 0x A02A 0AA6 (2,687,109,798)이 된다.
'리버싱' 카테고리의 다른 글
Reversing.kr Position 문제 풀이 (0) | 2023.07.03 |
---|---|
Reversing.kr ImagePrc 문제 풀이 (0) | 2023.06.18 |
Reversing.kr Music Player 문제 풀이 (0) | 2023.06.15 |
Reversing.kr Easy Keygen 문제 풀이 (0) | 2023.06.02 |
[리버싱 핵심원리] 메시지 후킹 실습에서 일어난 에러들에 대한 고찰 (0) | 2021.06.12 |