CodeEngn Basic09 풀이
Wargame | CTF/Reversing

CodeEngn Basic09 풀이

StolenByte를 구하라는 문제입니다. 훔쳐진바이트..?? 모르겠습니다.

일단 어떤파일인지 PEiD로 보겠습니다.

일단 UPX로 패킹되어있는걸 알아냈습니다. 동적분석을위해 한번 실행해 보겠습니다.

  

키파일 체크를위해 ok를 누르랍니다. 눌렀더니 파일이없다고 하네요 ok를 누르게되면 어떤특정파일이 있는지없는지 비교를 하는것같습니다.

 올리디버거로 가서 한번보겠습니다. UPX패킹이니 하드웨어브레이크를 걸고 달리겠습니다. OEP를 쉽게 찾아냈습니다.

OEP로 가보니.. 코드가 매우 간단합니다. 어셈블리어로 작성된것같습니다.

파일을생성하고, 파일이 없으면 에러문구로 점프, 파일이 생성되있어도 파일사이즈를 구한뒤 18바이트이어야 성공메세지로 점프하는군요.

왜 CreateFile함수가 실행되는데도 파일이 안만들어질까 해서 api를 찾아보니 CreateFile 의 5번째 인수의 값인 3을 스택에 넣고있는게 보입니다. 이 파라메터값의 뜻은 파일생성이 아닌 무조건열기 라는 뜻이라네요. 즉 파일을 열기만 한다는거죠. 사용자가 파일을 생성해줘야 될것같네요.

크랙이야 그냥 성공메세지로 점프시켜줘도되고, 파일을 만들도록 파라메터값을 수정해주면 될것같습니다. 

CodeEngn의 문제인 Stolenbyte를 구해야하는데요.. 

StolenByte의 뜻을 찾아보았습니다.


UPX등으로 패킹된 바이너리를 언팩하고 본래의 시작점(OEP-Original Entry Point)을 쫓아가 덤프를 뜨는 것이 일반적인 방법입니다. 이 과정을 방해하기위해 프로그램의 일부 바이트를 별도의 영역에서 실행되게 하여 OEP를 다른 위치로 가장하고 덤프를 쉽게 하지 못하도록 구현한 기법입니다. 이 경우 따로 떼어진 StolenByte를 함께 복원해줘야 덤프가 성공적으로 처리됩니다.

출처 : https://ask.fm/icewallhyu/answers/115846409228


라고 하네요.  음 ... 글쎄요 이 문제에서 OEP를 구할떄 그냥 쉽게 구해졌는데 말이죠... 덤프를뜨게되면 프로그램이 실행되지 않게 방지하는 기법인가봅니다.. 이 문제는 코드가 간단해 함수가 뻔히보여서 덤프는 뜨지않았죠

사실 OEP로 넘어가기전 이상한 부분이 있기는 있었습니다. 그냥 그려려니 하고 넘긴 부분이죠.  MessageBox 함수의 파라메터는 4개입니다. 그러나 OEP첫부분에 보면 MessageBox의 파라메터가 한개뿐입니다. 나머지 세개의 파라메터는 OEP넘어오기전에 스택에 저장했군요.

NOP의 크기는 12바이트입니다. 즉 StolenByte의 크기도 12바이트라는 뜻이죠 3줄의 OP code를 보아도 12바이트입니다. 맞군요

OEP로 넘어오기전 3줄의 어셈블리어를 OEP 부분 NOP에 끼워넣어줍니다. 그리고 덤프를 떠주면! 정상적으로 실행이됩니다.

StolenByte는 OP code 3개를 이어붙인 값이 되겠군요 풀이완료!


'Wargame | CTF > Reversing' 카테고리의 다른 글

CodeEngn Basic11 풀이  (0) 2017.09.11
CodeEngn Basic10 풀이  (0) 2017.09.03
CodeEngn Basic08 풀이  (0) 2017.08.30
CodeEngn Basic07 풀이  (0) 2017.08.30
CodeEngn Basic06 풀이  (0) 2017.08.21