<Wargame & CTF>/Reversing.kr

[Reversing.kr]Replace

gosoeungduk 2019. 2. 8. 21:45
반응형

 


바이너리를 실행시켜보면 아무거나 입력할 수 있는 창이 나온다. 아무거나 입력하고 Check 했더니 즉시 꺼져버렸다... ';;;


IDA에 올려보도록 하겠다.



WinMain 함수를 어렵지 않게 찾을 수 있었다.



WinMain 에선 단서가 될 만한게 안보여서 string 을 검색한 결과 "Correct!" 라는 string이 있는 곳을 발견했다!


그와 동시에 DialogFunc 에서 거의 모든 action이 일어난다는 것을 알 수 있었다.



그리고 DialogFunc에서 메인역할을 하는 것 같은 sub_40466F 함수가 디컴파일이 잘 안된다는 것을 발견할 수 있었다.


(alt + k 로 스택포인터 변경 불가)



아마 call 부분에서 정확한 주소가 아닌 오프셋을 5 추가한 부분을 call 하기 때문인 것 같다... (?)


어쩔 수 없이 어셈을 보면서 동적디버깅 해보기로 하였다.


그 전에 아까 "Correct!" 를 출력해주는 부분을 확인해야할 필요가 있다



Graph로 보면 Corret 구문으로 이어지는 부분이 없다.. 특별한 분기문이 없다면 어셈코드 순서상 loc_401071에

말뚝박혀있는 jmp를 어떻게든 조치를 취해야 할 것 같다.


(수동으로 nop을 만들어보고 실행시켜보았지만 로직을 이해해야 하는지 자꾸 끊긴다)



sub_40466F 를 타고가다보면 call $+5 가 실행되는데 그 call 되는 곳은 바로 이 부분 input으로 넣은 숫자 값을

2번씩이나 +1 시킨다.


그리고 이 call 을 바이너리 1회 실행동안 총 2 번 그러니까 input 숫자 값은 +4 증가 하게 된다.



그리고 여기서 0x601605C7 을 input 숫자에다가 더한다.


(이상하게 동적디버깅 할 때는 0x601605CC가 더해져서 좀 혼란스러웠다  ' _ ' ;)



그리고 이 부분 !! 이 문제가 공부하면서 참신하다고 생각했던 부분이다 ㅋㅋ


언뜻 보면 전역변수 같은데에 0xC39000C6을 넣는다고 생각할 수 있는데

사실 이 0xC39000C6 은 opcode 이다.



[ 0xC39000C6 을 넣기 전의 0x40466F 의 어셈과 hex 상황 ]



[ 넣은 후의 0x40466F 의 어셈과 hex 상황 ]


예상대로 opcode 그대로 들어갔고 byte 범위로 eax 주소에 0x90 ( nop )을 넣는다.


여기까지 봤을 때 무언가 번뜩이지 않는가 ?? 여기서 또 이 문제가 신박함을 느꼈다 ㅋㅋㅋ


아까 수동으로 넣었던 nop을 로직 flow를 따라서 자연스럽게 넣을 수 있게 된거다!!!


사진은 생략하겠지만 저 부분에서의 eax는 input 값에 + 4 + 0x601605C7 한 결과 값이 들어가 있다.


오류가 나서 진행이 안된 이유도 다 input 값을 이상하게 넣어서 이상한 주소에 nop을 입혀놨기 때문이다.


그러면 계산을 해보자. 



우선 eax 에는 0x401071 이 들어가있어야 함은 결론 났고,

0x401071 = input + 4 + 0x601605C7 의 꼴이 되어야한다.


그런데 위의 계산이 이상하다는 걸 눈치챘을 것이다. 그러므로 

최종 결과 값을 0x100401071로 해놓고 계산해야한다.



뭐 어찌어찌 input 값을 구해서.. Check 하면!?



DialogText 가 " Correct! " 로 바뀐다 !











반응형

'<Wargame & CTF> > Reversing.kr' 카테고리의 다른 글

[ Reversing.kr ] Ransomware  (0) 2020.01.02
[Reversing.kr]ImagePrc  (0) 2019.03.27
[Reversing.kr]Music_Player  (1) 2019.01.30
[Reversing.kr]Easy Unpack  (0) 2019.01.18
[Reversing.kr]Easy Keygen  (0) 2019.01.15