본문 바로가기

Reversing/CodeEngn

[CodeEngn] Basic RCE L11풀이

https://ch.codeengn.com/

 

CodeEngn.com [코드엔진]

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

ch.codeengn.com


문제

OEP와 Stolenbyte를 찾는 것이 문제이다.

실행화면

파일을 다운받아 실행시켜보니, 오른쪽 위의 그림처럼 ok를 누르라고 하고 누르면 파일을 찾을 수 없다고 한다.

 

일단 exeinfo로 파일을 확인해주었다.

EXEINFO

Upx 패킹이 되어있다고 한다.

Upx_unpacked.exe라는 파일을 따로 만들어서 언팩을 해주었다.

UPX 언패킹

패킹이 잘 풀렸고 다시 실행해보았는데 아래와 같이 문자들이 이상해졌다.

패킹이 된 걸 인지했나 보다,, 정확히 CRC 코드인지는 잘 모르겠지만 일단 언팩 파일로는 알 수 없을 것 같아서 그냥 패킹된 상태의 파일로 진행해주었다.

 

X32디버거를 사용해서 열어주었다.

위의 PUSHAD에서 조금만 내려오다 보면 POPAD를 찾을 수 있고, OEP로 점프하기 전에 연속된 PUSH값이 Stolenbyte이므로 위의 그림에서 회색으로 표시된 부분이 Stolenbyte라고 쉽게 알 수 있었다.

Stolenbyte : 6A0068002040006812204000

 

이제 OEP를 찾아야 하는데 POPAD에 BP를 걸고 내려오다 보니, JNE 부분에서 ESP와 EAX 값이 같지 않아서 JMP까지 갈 수가 없다.

 

그래서 오른쪽의 레지스터 창에서 ESP 값을 EAX와 같도록 바꾸어 주고, F8을 눌러서 진행하니 JMP까지 내려올 수 있었다!

이제 그대로 40100C로 이동해보았다.

누가 봐도 OEP스럽고 메인 함수스러운 부분이 나왔다.

여기서 문제 끝!이라고 생각하면 참 어리석었다.

 

살짝 화면을 올려보면 12개의 nop이 쭉 있는 것을 볼 수 있다.

 

검색해보니 어셈블리어에서 빈 공간을 채우기 위한 용도로 아무 의미 없는 nop을 이용한다고 하는데 하나 당 1byte씩 차지한다고 한다.

 

그럼 현재 12바이트가 채워져 있다는 이야기인데, 위의 stolenbyte를 잠깐 가져와보았다.

 

Stolenbyte : 6A0068002040006812204000

6A 00 68 00 20 40 00 68 12 20 40 00

딱 12바이트가 맞는 것을 알 수 있다.

즉, 정리하자면 우리가 OEP라고 생각했던 40100C위에 12바이트의 Stolenbyte를 위한 공간이 있고, 제대로 실행할 경우 해당 부분에 stolenbyte가 채워져서 실행될 것이라고 생각할 수 있다.

 

그러니까 다시 말해서 Original Entry Point는 40100C가 아닌, Stolenbyte부터 시작하는 401000이라는 것을 알 수 있다.

 

[FLAG]

OEP : 00401000

Stolenbyte : 6A0068002040006812204000

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

[CodeEngn] Basic RCE L14풀이  (0) 2021.09.13
[CodeEngn] Basic RCE L12풀이  (0) 2021.08.18
[CodeEngn] Basic RCE L10풀이  (0) 2021.08.18
[CodeEngn] Basic RCE L09풀이  (0) 2021.08.18
[CodeEngn] Basic RCE L08풀이  (0) 2021.08.18