CodeEngn Write Up/Basic

CodeEngn Basic RCE L11 Write Up

서원근양학계정 2022. 2. 17. 00:38

문제:OEP를 찾으시오. Ex) 00401000 / Stolenbyte 를 찾으시오.
Ex) FF35CA204000E84D000000 정답인증은 OEP+ Stolenbyte
Ex ) 00401000FF35CA204000E84D000000

https://ch.codeengn.com/

 

CodeEngn.com [코드엔진]

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

ch.codeengn.com

 

먼저 문제 파일을 실행시켜보겠습니다.

 

키파일이 있는지 확인하는 프로그램이라고 생각됩니다.

확인을 눌러보니 파일을 찾을 수 없다고 합니다.

 

이 문제에서 원하는 답은 OEP와 StolenByte를 찾는 것이므로 패킹이 되어있을 것으로 예상되지만 정확한 정보를 얻기 위해서 PEiD로 열어보겠습니다.

 

UPX로 패킹된 것을 확인할 수 있습니다.

패킹에 대한 내용은 여기를 참고해주세요.

https://brainfreeee.tistory.com/33

 

패킹(Packing)에 대하여

패킹(Packing)이란? 패킹(Packing)은 실행압축이라는 뜻을 가지고 있습니다. 실행압축이란 말 그대로 압축을 푸는 과정 없이 바로 실행시킬 수 있는 압축방법입니다. 실행압축은 일반적인 압축인 Z

brainfreeee.tistory.com

 

UPX언패킹 도구를 이용해서 패킹을 풀 수도 있지만 OllyDBG를 이용해서 직접 패킹을 풀고 OEP와 StolenByte를 구해보겠습니다.

먼저 PUSHAD를 실행시킵니다.

 

그리고 변경된 ESP의 값을 메모리의 주소로 해서 이동한 다음 그 주소에 HWBP를 걸어줍니다.

 

그리고 F9를 이용해서 실행시키면 POPAD 다음 줄에서 멈추게 됩니다.

 

메시지 창에서 봤던 문자열과 약간의 명령어들, OEP로 가는 JMP가 보입니다.

일단 JMP를 통해서 OEP로 가보겠습니다.

 

코드의 윗부분이 NOP으로 채워져 있는 것을 확인할 수 있습니다.

원래 저 자리는 OEP로 점프하기 이전에 있던 명령어들이 있어야 할 자리입니다.

이 상태로 덤프를 떠보겠습니다.

덤프와 언패킹에 대한 내용은 여기를 참고해주세요.

https://brainfreeee.tistory.com/34

 

언패킹(Unpacking)에 대하여

언패킹(Unpacking)이란? 언패킹이란 패킹의 반대되는 개념으로, 패킹했던 파일의 패킹을 푸는 것을 의미합니다. 패킹된 프로그램이 실행되면 먼저 패킹이 된 원본 코드를 언패킹시키는 해제하는

brainfreeee.tistory.com

 

 

 

플러그인을 실행시키면 이런 창이 뜹니다.

Entry Point의 값을 00001000으로 바꿔주고 "Dump" 버튼을 눌러줍니다.

경로는 적당히 지정해줍니다.

 

그리고 덤프 된 프로그램을 실행시키면 오류가 발생합니다.

 

오류를 해결하기 위해서 LordPE를 이용해보겠습니다.

 

"Rebuild PE" 버튼을 눌러줍니다.

그리고 덤프 된 프로그램을 선택합니다.

 

이제 프로그램을 실행시켜보겠습니다.

 

프로그램이 실행은 되지만 오류가 발생한 것을 알 수 있습니다.

그 이유는 이 프로그램에 StolenByte가 적용되어 있기 때문입니다.

StolenByte에 대한 내용은 여기를 참고해주세요.

https://brainfreeee.tistory.com/35

 

StolenByte에 대하여

StolenByte란? StolenByte란 훔친 바이트라는 뜻으로 패킹된 프로그램에서 코드의 일부를 OEP로 점프하기 이전에 숨기는 것을 의미합니다. StolenByte를 적용하는 이유 패킹을 풀 때는 OEP를 찾아서 덤프를

brainfreeee.tistory.com

 

이 문제를 해결하기 위해서는 덤프를 뜨기 전에 OEP이전에 있던 PUSH들을 OEP로 옮겨야 합니다.

 

이 부분이 OEP로 옮길 코드들입니다.

 

NOP를 더블클릭하거나 스페이스바를 이용하면 코드를 수정할 수 있습니다.

 

 

 

 

코드를 수정하는 것을 완료했습니다.

이제 수정한 코드를 덤프 떠보겠습니다.

 

Entry Point의 값만 00001000으로 바꿔주시고 "Dump" 버튼을 누릅니다.

그리고 LordPE를 이용해서 오류가 발생하지 않게 해 줍니다.

이제 프로그램을 실행시키면 정상적으로 실행됩니다.

 

이 프로그램의 OEP는 00401000이고 StolenByte는 6A0068004020006812204000이므로 정답은 004010006A0068004020006812204000이 됩니다.

 

Flag: 004010006A0068002040006812204000

'CodeEngn Write Up > Basic' 카테고리의 다른 글

CodeEngn Basic RCE L13 Write Up  (0) 2022.03.11
CodeEngn Basic RCE L12 Write Up  (1) 2022.02.21
CodeEngn Basic RCE L10 Write Up  (1) 2022.02.10
CodeEngn Basic RCE L09 Write Up  (1) 2022.01.05
CodeEngn Basic RCE L08 Write Up  (1) 2021.10.05