[Reversing.kr] Replace

해킹대회 문제 풀이 연습장소

Moderator: amesianx

Post Reply
snow
Posts: 1
Joined: Wed Jan 04, 2017 8:53 pm

[Reversing.kr] Replace

Post by snow » Wed Jan 11, 2017 8:38 pm

Replace 풀이입니다.

1. Replace 파일 실행하면 에러 메시지가 출력됩니다.
Image
1. Replace 실행화면


2. 다음은 디버거를 이용해서 Replace디버깅한 화면입니다.
특정 위치에서 멈춤니다.
Image
2. 디버깅 화면


3. all intermoduler calls 를 이용해서 GetDlgitemInt API 에 브레이크 포인트를 걸어 줍니다.
GetDlgitemInt API는 다이얼로그에서 입력값을 가져오는 함수입니다.
그리고 그 값을 0x004084D0 주소에 값을 저장합니다.
Image
3. GetDlgItemInt API


4. 3번 그림을 보면 JMP Replace.0040466F 명령어로 0x0040466F 를 호출합니다.
이 코드에서 중요한 부분을 간략화 하면 다음과 같습니다.

- [0x004084D0]에 값을 1 증가 ->
[0x004084D0]에 값을 1 증가 ->
[0x004084D0]에 값에 0x601605C7을 더한다.

Image
4. 0x0040466F


5. 3번 그림을 보면 Replace.00404690 를 사용해서 0x00404690 주소로 이동한다.
이 코드에서 중요한 부분을 간략화 하면 다음과 같습니다.

- 밑에 그림에서 MOV DWORD PTR DS:[40466F], C39000C6 를 통해서 0x0040466F(Code 영역)을 덮어씁니다.

- [0x004084D0]에 값을 1 증가 ->
[0x004084D0]에 값을 1 증가 ->
MOV BYTE PTR DS;[EAX],90 ->
INC EAX 다음 주소로 증가 시키고 ->
MOV BYTE PTR DS;[EAX],90

0x90 Not Operation 은 무연산 입니다.
EAX 에는 0x004084D0 값이 들어있습니다.
Image
5. 0x0040466F


3 번 그림을 보면 Correct 을 설정해주는 SetDIgItemTextA API 를 건너뛰는 어셈블리 언어(JMP SHORT
Replace.00406034)가 있습니다.
이 어셈블리언어를 0x90로 바꿔서 성공 메시지를 건너뛰지 못하게 한다.
4, 5번째를 보면 0x004084D0 를 증가 시키고 더하는 것을 정리해 보면
X + 2 + 0x601605C7 + 2 = 0x00401071(건너뛰는 어셈블리 위치) 입니다.
Image
6. 계산 결과


위 값의 10진수가 Flag 입니다.
Image
7. Flag를 입력 결과

Post Reply

Who is online

Users browsing this forum: No registered users and 21 guests