코드엔진 Basic RCE L09 문제를 풀어보았다.
문제는 다음과 같다.
StolenByte라는 용어를 처음 들어봐서, 검색을 해보다가 이에 대해 잘 설명한 글을 발견했다.
용어에 대한 설명을 읽었어도 잘 이해하지 못해 다른 풀이의 도움을 받아 풀었다.
그래서 UPX로 압축을 풀어줬다. (사용한 명령어: upx.exe -d -o 새로만들파일 압축해제할파일)
패킹된 파일을 실행해보면 다음과 같은 창이 두 개 뜬다.
글자가 깨지는 이유는 아래와 같이 MessageBox 함수를 호출하는 부분의 인자값 부분이 NOP으로 채워져있기 때문이라고 한다.
그래서 다른 곳의 정상적인 문자열을 이곳으로 가져올 것이다.
아래는 언패킹을 하기 전 원본 실행파일이다. POPAD 뒤에 MessageBox의 인자값으로 보이는 문자열들이 있다.(StolenByte는 OEP주소로 점프하기 전 위치에서 PUSH된다고 한다. POPAD 뒤에 OEP주소로 점프하는 곳이 있다.) 이 문자열들이 JMP를 통해 원래 소스코드로 돌아가기 전에 스택에 저장되어 있다. JMP를 한 후에는 바로 MessageBox를 호출하게 된다.
저 부분을 복사해서 원래 메세지박스의 NOP부분에 붙여넣어준다.
패치를 마치고 저장 후 실행하면 이전과는 달리 정상적인 창이 뜬다!