문제
StolenByte를 구하시오. Ex) 75156A0068352040

09.exe도 UPX로 패킹되어 있다. 언패킹 해주자.

언패킹 했으니까 Ollydbg로 실행시켜보자.

Ollydbg로 열어보면 처음엔 Nop sled가 있고, 003010A5부터 끝까지는 DB 00으로 채워져있다.
이때 문제에서 묻는 StolenByte다 Nop sled의 영역인가 싶어서 90을 입력해보았다.
음. 역시 아니었다 ^^!
이렇게 푸는 문제가 아닌 것 같아서, 일단 한 줄씩 실행시켜 보았다.
실행시키다 보니

MessageBoxA에서 호출되는 함수에서는 인자가 총 4개가 필요한데,
0040100E에 있는 MessageBoxA에서는 PUSH가 하나만 이루어지는 것을 볼 수 있었다.
이것 때문에 제일 처음 출력되는 메시지 박스가 깨진 채로 보이게 되는 것이었다.
이때 위에도 말했듯이 코드 내에서는 별다른 내용을 찾을 수가 없어서, 패킹 전의 파일을 ollydbg로 다시 열어보았다.
[ Reversing ] UPX - OEP 확인
1. UPX - OEP 확인 OEP : Original Entry Point - 패킹된 파일의 실제 프로그램 시작 부분 입...
blog.naver.com
위의 사이트를 참고하여 진행하였다.
위의 사이트에 따르면,
UPX 패킹이 되었을 경우
PUSHAD~POPAD 명령어 내부에서는 압축 해제 코드가 실행되고,
POPAD 명령어 실행 후에는 JMP 명령어를 통해 OEP로 이동한다.
그렇다면 패킹된 파일을 실행했을 때 PUSHAD부터 POPAD 까지는 패킹된 파일을 언패킹하는 과정이라고 볼 수 있다.
그래서 언패킹이 끝나는 POPAD 부분을 검색하여 찾았다.


이때, 네이버 블로그에서 확인한 것과 다른 명령어가 있음을 알 수 있었다.
POPAD 바로 다음 12바이트에 PUSH 명령어 3개가 있는 것을 볼 수 있었고,
이 명령어가 아까 MessageBoxA에서 부족했던 인자 3개임을 유추할 수 있었다.
그래서 JMP에 breakpoint를 걸어두고 실행해보았다.

그랬더니 위와 같은 문자열이 떴다.
이게 메시지 박스에 뜨는 문자열인 것 같아서 이 명령어를 언패킹 된 파일에 넣어보았다.



그런 다음 프로그램을 실행시켜주었다.

이전과는 다르게 깨지지 않은 메시지 창이 뜬다.
이 opcode를 입력하였더니 문제가 풀렸다!
'Wargame > CodeEngn' 카테고리의 다른 글
CodeEngn Basic RCE L11 (0) | 2021.05.16 |
---|---|
CodeEngn Basic RCE L10 (0) | 2021.05.10 |
CodeEngn Basic RCE L08 (0) | 2021.05.10 |
CodeEngn Basic RCE L07 (0) | 2021.05.10 |
CodeEngn Basic RCE L06 (0) | 2021.05.09 |