바이너리를 실행시켜보면 아무거나 입력할 수 있는 창이 나온다. 아무거나 입력하고 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 |