본문 바로가기

Reversing/CodeEngn

[CodeEngn] Basic RCE L09풀이

https://ch.codeengn.com/

 

CodeEngn.com [코드엔진]

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

ch.codeengn.com


문제

문제를 확인해보니 Stolen Byte를 구하라고 한다.

Stolen Byte가 무엇인지 몰라서 검색을 해보니, 도난 바이트로, 패커가 이동시킨 코드의 윗부분이라고 한다.

무슨 말인지 몰라서 더 자세히 찾아보니

프로그램의 한 부분의 코드를 훔쳐내어 다른 부분으로 옮겨진 코드를 의미하고, 보통 옮겨진 코드들은 OEP 주소로 점프하기 전 위치에서 PUSH 된다고 한다.

그래서 POPAD와 jmp OEP 사이에 연속된 PUSH 부분을 Stolen Byte라고 한다고 한다.

 

일단 exeinfo를 통해 확인해보았다.

 

exeinfo

확인해보니 패킹이 되어있었고, 일단 OEP 가 무엇인지 알아야 하기 때문에 실행파일을 복사해서 언패킹 해주었다.

(문제를 풀다보니 패킹된 파일과 언패킹 파일을 각각 만드는 게 습관처럼 됐다,,, 두개를 같이 봐야 하는 문제가 많아서,,,)

 

upx 언패킹

일단 언팩한 파일을 x32 디버거로 열어주었다.

언패킹 파일

정상 파일의 경우 시작하자마자 커서가 멈춘 곳이 OEP 주소라서 OEP가 401000이라고 생각했는데,

패킹 되어있는 파일을 보면 40100C로 점프를 한다,,, 왜이래,,,

 

알았다!!! 뒤에 문제들을 보다 보니 알았는데, stolenbyte와 관련이 있었다! 
nop은 어셈블리어에서 빈 부분들을 채우기 위한 의미 없는 명령어인데 1byte를 차지한다고 한다.
그러니까 패킹 파일에서 찾을 수 있었던 stolenbyte가 언패킹 파일에서 정상 실행되기 위해서는 해당 바이트들을 가져올 수 있는 영역이 필요한데 그 부분을 nop으로 채워둔 것이다.
다시 말해서, 위의 nop은 stolenbyte를 위한 공간이고 위에서는 nop이 12개, 즉 12바이트이고
아래의 stolenbyte를 보면 6A 00 68 00 20 40 00 68 12 20 40 00으로 12개가 맞으므로 해당 부분을 뜻한다!

결과적으로 OEP는 40100C가 아니라 stolenbyte의 공간까지 합쳐진 401000이 OEP가 되게 된다.

패킹 파일

일단 Stolen Byte는 jmp위의 push가 많이 있는 부분이라고 했으므로

6A0068002040006812204000

이 답이 될 것 같고, 실제로 답이 맞다.

 

일단 문제에서 구하라고 하는 부분만 구했다!

'Reversing > CodeEngn' 카테고리의 다른 글

[CodeEngn] Basic RCE L11풀이  (0) 2021.08.18
[CodeEngn] Basic RCE L10풀이  (0) 2021.08.18
[CodeEngn] Basic RCE L08풀이  (0) 2021.08.18
[CodeEngn] Basic RCE L07풀이  (0) 2021.08.18
[CodeEngn] Basic RCE L06풀이  (0) 2021.08.01