[reversing.kr] Replace 풀이
- 리버싱/reversing.kr
- 2020. 3. 9. 22:58
정형화된 유형의 키젠만 풀어봤기 때문에 뇌정지가 왔던 문제이다.
reversing.kr Replace 풀이
Replace.exe는 입력값을 받아서 check하는 심플한 프로그램이다.
언제나 그렇듯, 먼저 체크 루틴에서 사용되는 문자열이 사용되는 함수로 가보았다.
이번 문제는 특이한게, Correct로 가는 분기가 아예 없다. 정답값 인증이 입력값인 경우밖에 생각할 수 없으므로 입력한 입력값을 알맞게 주면 그게 ~~~ 되어 뭔가 Correct 분기를 탈 수 있게 만들어야 하는 문제인 것 같다.
함수가 별로 크지 않으므로 트레이싱 하면서 봐보자. 참고로 이번 파일은 IDA가 틀리게 디컴파일한 부분이 많아서 동적으로만 보려고 한다.
입력값을 123(0x7B)으로 주고 입력값을 입력받아서 eax에 저장하는 GetDigItemInt 호출 이후부터 좀 살펴보면 404690으로 점프하기 전까지 결국 [4084d0]= 입력값+(0x4)+(0x601605C7) 이되고 eax=0 으로 초기화, [406016]이 특정 값으로 채워진다.
그리고 그다음 404690으로 점프한 후 eax=입력값+(0x4)+(0x601605C7) 이되고, [4048d0]은 +0x1이 한번 더되고 [40466f]가 특정 값으로 채워진다. 그리고 나서 이상한게 'call 40466f'이다.
40466f로 들어가보면, eax=입력값+(0x4)+(0x601605C7) 인데 여기에 0x90을 쓰고있다. 그럼 우리가 입력값을 줘서 바꿀 수 있는 부분은 0x90을 쓰는 주소인 것이다.
어떤 주소인지는 Correct가 어떻게하면 실행이 될까와 연관지어 생각하면 된다. (이래놓고 사실 난 삽질을 엄청 많이했다...ㅋㅋ) Correct로 가기 직전에 jmp문이 2개가 있기 떄문에 뭔가 이 jmp문 주소가 eax가 되게하면 되는데 일단 테스트를 위해 eax에 비어있는 쓸수 있는 주소 아무거나 줘봤다.
0x90을 쓰는 행위를 하는 함수 40466f는 두번 실행되기 때문에 결국 0x9090이 써지고 2번째 jmp문인 401071로 점프하게 된다. 어차피 401071로 점프하기 때문에 eax값은 401071이 되면 된다. 그러면 입력값+~~~=401071=eax가 되면 여기에 nop이 써질 것이고 jmp가 무효화가 되고 Correct가 나오는 코드가 실행될 것이기 때문이다.
그러면, 단순계산만 해주면 정답값이 나온다.
'리버싱 > reversing.kr' 카테고리의 다른 글
[reversing.kr] Position 풀이 (0) | 2020.03.10 |
---|---|
[reversing.kr] ImagePrc 풀이 (0) | 2020.03.10 |
[reversing.kr] Music Player 풀이 (0) | 2020.03.08 |
[reversing.kr] Easy Unpack 풀이 (0) | 2020.03.07 |
[reversing.kr] Easy Keygen 풀이 (0) | 2020.03.07 |