티스토리 뷰

1. PEID로 열어본 화면입니다. C++로 만들어져있고, GUI에, 패킹이 안되어 있습니다.

2. 실행을 하고 123을 눌렀지만 오류가 나네요!

3. Resource Hacker로 열어본 결과 Control ID값을 확인할 수 있었습니다. EditText 창은 '1002' Button(Check)는 '1003' TextArea(Wrong)는 '1001'입니다. 

4. IDA로 봤더니, 전체적인 소스 흐름은 EditText에 정확한 숫자를 입력해야 성공을 하는 것 같은데, IDA는 'Correct'부분을 해석하지 못합니다. 분석을 어렵게 하기 위해 조작을 했을 것 같네요.

5. 올리디버거로 실행하여 user32.dll의 DialogBoxParamA(DialogBox 띄움), GetDlgItemInt(입력 글자를 INT형식으로 반환), SetDlgItemTExtA(INT형식으로 반환한 숫자를 TextArea에 띄움)을 BP를 걸고 실행을 합니다.

6. 실행을 했더니 DialogBoxParamA에서 멈추고 창이 하나 뜨면서 입력 값을 받습니다. 저는 임의로 '123'을 입력 하겠습니다.

7. 눌렀더니 GetDlgItemInt에서 또 멈추네요. 123을 INT 형식으로 반환합니다. 

8. 반환 값에는 7B(123)이 반환 되었습니다.

9. 401060줄을 실행 하면 4084D0 주소에 반환된 값(7B(123))을 넣어 줍니다.

10. 40466F 줄의 40467A 함수를 F7로 들어갑니다.

11. 40467A줄에서 406016주소 값에 '619060EB' 값을 넣습니다. EB는 JMP이므로 다른 곳으로 점프해서 동작을 하는 것을 짐작 할 수 있습니다.

12. 4084D0에 아까 7B(123)을 넣어줬었는데 여기서 2번을 INC로 더해줍니다.

13. 7D가 됩니다.

14. 40466F줄을 실행 완료하고 404674줄로 돌아와서 DB 81을 만나게 되는데 여기서 분석을 어렵게 하기 위해서 Analyse code로 바꿧네요. 임의로 다시 풀어 줍니다.

15. 풀어줬더니 DB 81 값이 ADD를 시키는 어셈블리로 풀어졌네요. 안 풀어줘도 실행을 통해 601605C7 값을 더해주는 것을 알 수 있지만, 풀어줌으로써 깔끔한 코드를 볼 수가 있습니다. 즉, 이 명령문은 4084D0(이전에 입력한 텍스트 값)에 601605C7을 더해줍니다. 그 밑의 PUSHAD, POPAD는 쓰레기 코드이므로 넘어갔습니다. 

16. return을 하고 40106C 명령문에서 404690으로 JMP합니다.

17. 404690 명령줄을 보면 EAX에 4084D0에 있는 값을 넣습니다. 

46061660 값을 EAX에 넣어줍니다.

18. 프로그램의 오류가 나는 부분이 이 명령 문입니다. 40466F 주소값에 'C39000C6'값을 넣어서 실행합니다. C3은 RETN(리턴)이고 90은 NOP입니다.

19. 40466F를 들어가본 결과, 아까 EAX에 넣어준 46061660(입력값(7F(123)) + 601605C7 + INC(4))에 90(NOP)를 넣어주게 됩니다. 오류가 나는 이유는 존재하지 않는 메모리 값에 90(NOP)를 넣어주니, 오류가 나는 것입니다. 여기서 힌트입니다. NOP를 어디다 넣어줘야 프로그램이 오류가 나지 않고 잘 실행이 될 까요.

20. 401073명령줄을 보시면 아까 DB와 같이 묶여있네요. 아까와 같은 방법으로 풀어줍니다. 

21. 깔끔하게 PUSH로 "Correct!"부분을 넣어주는 부분이였네요. 여기서 보실게 401071명령 줄때문에 40106C를 실행하여 JMP하고 다시 401071로 되돌아와서 Correct 부분을 지나쳐 401084 부분으로 점프합니다. 즉, 아까 19번에서 NOP를 401071~401072부분에 NOP를 넣어줘야 합니다. 

정리를 해보면, 일단 401071을 NOP로 만들어줘야 합니다. 하지만 메모리 주소가 아닌 곳에 NOP를 하게 되면 오류가 나니까, 바꿔야 합니다. 원래 EAX에는 46061660(입력값(7F(123)) + 601605C7 + INC(4)) 값이 들어갑니다. 이 부분을 401071 주소로 만들어야 합니다. 실제로 총 더해주는 값은 601605C7 + 4 = 601605CB입니다. 601605CB에 입력값을 더한 것이나 다름없죠. X를 넣어줘야 하는 입력값이라고 한다면, X + 0x601605CB = 0x401071 값이 나오네요. X를 구해 보겠습니다.

22. 일단 X를 구하기 위해서는 오버플로우 값을 구해야 합니다. 0xFFFFFFFF은 4294967295 이기 때문에 +1을 더해서 입력을 하면 입력 값은 0이 됩니다. 

X = 0xFFFFFFFF+0x401071-0x601605CB가 됩니다. 여기서 601605CB에서 1을 뺴줘야 하는데 이유는 밑의 그림과 같이 EAX에 이미 값을 넣어 넣고, 증가를 했기 때문에 1을 빼줘서 601605CA가 됩니다.

23. 값을 구하는 식입니다. 

24. Clear!


'Wargame > reversing.kr' 카테고리의 다른 글

reversing.kr_ImagePrc 풀이  (0) 2015.07.05
reversing.kr_CSHOP 풀이  (0) 2015.07.03
reversing.kr_Ransomware 풀이  (2) 2015.07.02
reversing.kr_Easy_ELF 풀이  (0) 2015.07.01
reversing.kr_Easy Unpack 풀이  (0) 2015.06.30
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함