워게임 풀이
Reversing.Kr
This site tests your ability to Cracking & Reverse Code Engineering. Now Challenge a problem for each environment. (Windows, Linux, .Net, Flash, Java, Python, Mobile..) Admin E-Mail: gogil@reversing.kr
reversing.kr
6. Replace
문제 파일 압축을 풀어 실행해보면 위와 같은 화면이 실행된다.
숫자만 입력할 수 있고(숫자가 아닌 값을 입력하면 그냥 종료됨), 입력값을 넣으면 그냥 종료된다.
아무 값이나 넣고 실행시키면
0040466F에서는 EAX에 0x90(NOP)을 저장하고, 여기서 문제가 발생한다.
왜냐하면 현재 EAX에 저장되어 있는 주소인 601605E9는 접근할 수 없는 주소이기 때문이다. 접근할 수 없는 곳에 0x90이라는 값을 넣으려고 하니 오류가 나는 것이다.
String에서 수를 입력받는 부분을 찾았다. GetDigItemInt로 int(수)를 받아오고 있다.
40105A에 BP를 걸고 실행하겠다.
40105A에서 멈췄다.
40105A: 숫자를 입력받고, 16진수로 변환 후 EAX에 저장
401060: 0x4084D0에 EAX 값 저장
401065: 40466FF 함수 호출
40466F 함수를 호출했으므로 40466F 함수는 어떤 것을 수행하는지 알아볼 것이다.
[0x40466F]
40467A 호출, 4084D0 += 601605C7
0x404689 호출, 4084D0 =1
RETN, 4084D0 +2
40466F: 40467A 함수 호출
40467A: 61906EB의 값을 406016 주소에 넣음
404684: 40489 함수 호출
404689: 0x4084D0 주소의 값 1 증가 (INC는 피연산자 값 1 증가)
40468F: 404689로 돌아가서 다시 한 번 더 0x4084D0 주소의 값 1증가 후 404674 주소로 RETN (CALL을 통해 호출된 함수에서 다시 복귀하기 위해 사용하는 명령)
[ 0x40467A ]
4084D0 + 3, RETN 후 다시 4084D0 + 4
[ 0x404690 ]
4084D0 ( 0x601605C7 + 4 + 입력값 ) 을 eax 에 옮기고,
0x404689 호출 ( 4084D0 + 1 )
그리고 0x40466F 함수에 C39000C6 덮어씀
↓
RUN을 누르니 함수가 변했다.
eax 값에 90(NOP)을 넣고 리턴
0x40466F 함수 호출 후, EAX +1 , 다시호출
6E8 을다시넣어서 함수복구,
0x401071로 점프
하지만, 임의의 주소에 NOP을 쓰니 오류가 발생하는 것 같다.
[ 0x401071 ]
0x401084 로 점프한다. (EndDialog)
추가로 401073이 Correct라는 걸 확인
함수분석을 통해, 0x601605C7 + 4 + X , 0x601605C7 + 5 + X 에
각각 90 (NOP) 을 쓸 수 있다는 것을 알았다.
401071 에 EB 11 (JMP SHORT 00401084) 을 90 90 으로 만들면
JMP 문 밑에있는 Correct 세팅함수가 실행될것이다.
0x601605C7 + 4 + X = 0x401071 이 되어야한다.
X = 0x401071 - 4 - 0x601605C7
X 의 값이다. 주소값은 8byte 이기때문에
A02A0AA6 만 있으면 된다.
입력하는 것이 int형 이므로
10진수로 변환 -> 2687109798
'Reversing' 카테고리의 다른 글
[Reversing] Position_WirteUp (1) | 2023.05.24 |
---|---|
패킹과 언패킹 (0) | 2023.05.17 |
[Reversing] Music Player_WirteUp (0) | 2023.05.13 |
DLL, IAT, EAT 분석 (0) | 2023.05.12 |
[Reversing] ImagePrc_WirteUp (0) | 2023.04.29 |