문제풀이/CodeEngn

[CodeEngn]Advance 06 문제 풀이과정

ILV_쉱이 2022. 1. 31. 19:57
728x90
반응형


CodeEngn 사이트

https://ch.codeengn.com/

CodeEngn.com [코드엔진]

코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 세미나, 워크숍을 현업 실무자들과 함께 운영하고 있는 비영리 커뮤니티입니다.

ch.codeengn.com

위 사이트에서 Advance 06번 문제를 다운로드 받습니다. 그 후 압축 푸시면 비밀번호입력이 나오게 됩니다. 비번은 'CodeEngn'입니다.


Advance 6번 문제

남은 군생활은 몇일 인가 정답인증은 MD5 해쉬값(대문자) 변환 후 인증하시오 입니다.


Advance 6번 문제풀이

PUSHAD를 보니 패킹되어 있었습니다. 그래서 이 거 또한 UPX로 패킹을 풀거나 x32dbg에 있는 플러그인으로 언패킹합니다..

저는 UPX로 언패킹하였습니다.

언패킹을 한 Advance 6번 문제를 x32dbg에 올렸고,
‘F8’을 눌러 하나씩 실행한다. [0x00417700 ‘call a06.40EA50’]을 실행하니, 메시지 박스가 출력된다. 메시지 박스가 출력되는 것을 보아 ‘IsDebburgerPresent’가 있다고 생각하였습니다.

그래서 모듈간 호출을 하여 ‘IsDebuggerPresent’을 찾습니다.
모듈간 호출은 오른쪽 마우스 -> 다음을 찾기 -> 모든 모듈 -> 모듈간 호출을 하면
현재 a06.exe에 있는 모든 모듈이 다 검색된다, 검색된 이후에 IsDeburggerPresent’를 검색하고, 검색된 IsDebuggerPresent를 모두 BreakPoint 걸었습니다.

다시 재 실행(Ctrl +F2)하고, ‘F9’를 눌러 실행한다. ‘F9’를 눌러 실행하게 된다면, 전 단계에서 BreakPoint 했던 곳에 걸렸습니다.

[0x0040E967 ‘test eax,eax’]에서 ‘test eax,eax’를 ‘cmp eax,eax’로 변경한다.
변경하여 ‘F9’를 누른 결과 “나의 남은 군 생활은?” 이라 뜨며 메시지 박스가 호출되었다.

다시 실행하여 ‘F8’을 하여 [0x0045E071]에 있는 MessageBoxW에 BP를 걸어놓는다.
위 메세지 박스는 하단의 그림에 있는 빨간 부분이 출력하는 부분입니다.

이 메시지 창 이후에 계속 ‘F8’을 실행시켜보니 어떠한 루프문을 돌게 되었고, 그 루프문을 빠져 나가니 맨 처음 메세지 박스가 뜨더니 숫자가 카운트 되는 것을 볼 수 있었습니다??

그 후 확인을 눌러도 계속MessageBox만 뜨게되고, 자동적으로 카운터는 계속 올라갔습니다 ㅋㅋㅋㅋ

790에서 x32dbg는 종료가 되었습니다. 그래서 남은 복무일은 790 이라는 것은 알게되었는데 ㅋㅋ 리버싱 문제를 이렇게 풀면 안될거같다는 생각에 cmp부분에서 정확히 찾기위하여 MessageBox가 뜨는 곳으로 다시 돌아가서 비교문이 있는지 확인하였습니다.
다시 재실행하여 아까 BP걸었던 ’MessageBoxW‘까지 실행하고, ‘F8’로 계속 실행하다보면 [0x00408F13 cmp ‘ebp,eax’]가 있었습니다.

이 곳을 보니 eax는 사용자가 실행한 값이고, ebp가 되면 종료되게 코드가 짜여 있었다.
이때의 ebp 값은 ‘00000316’이고, 이것을 10진수로 변경하면 ‘790’입니다.
이러면 앞서 ‘790’에서 종료가 된다는 것도 맞는 말이 되었습니다.

따라서 남은 군 복무 일 수는 ‘790이 되었습니다.

 

728x90
반응형