YeoPEVA

코드엔진 basic 9번 문제 공략 본문

#Reversing/CodeEngine

코드엔진 basic 9번 문제 공략

YeoPEVA 2018. 3. 30. 00:23

StolenByte를 구하는 문제였습니다 :)


바로 문제 풀러 가보겠습니다 ^^ 

이제 예전처럼 조금 재밌게 해볼께요.

[차피 총 정리 보고서로 해서 따로 하나 더 만들꺼거든요.. - 코엔 공략 다 모아서..]


PS) 이래서 새벽에 공략 쓰면 안된다니까..



UPX 패킹이 걸려 있었습니다. 



바로 무식하게 풀어버리ㅁ..



네. 깨져요 [????????]



??????????????????????????

왜 이렇게 되냐고요?


고오건 바로 풀어보면서 알아봅시다 ^^



그래서 일단 무작정 올리디버거로 UPX 걸려있는 상태의 바이너리를 오-픈 했습니다 ^^

UPX 특징인 POPAD, 


PUSHAD를 찾을 수 있었습니다.


우선 PUSHAD 측으로 가, OEP로 이동하니..


[잉.. 뭐야.. 뭔가 없는데..?]


응..? 뭔가 없는데요?

다른 메세지 박스 함수들을 호출하는 과정과 다르지 않나요?



원래라면, 위와 같이 파라미터 [인자 값]을 호출 전에 Push 해줘야하는데, 



없습니다. [??????????]

4개의 인자 값이 들어가야하는데, 하나 밖에 없어요.. 

3개는 어디로 갔을까요??



음.. POPAD 앞에 Push를 하고 있는 것이 보이시나요?

앞에 증발한 3개의 인자 값이 여기에 있습니다.

[뚜둥!]


이것이 바로 StolenByte입니다. 

프로그램의 한 부분의 코드를 훔쳐내어, 다른 부분으로 옮겨진 코드를 Stolenbyte라고 합니닷.

위와 같이, Stolenbyte로 인해, 아까전 언패킹 이후, 문자열이 깨졌음을 알 수 있습니다.


그러니.. 저어기 뒤에 NOP code를 수정한 뒤, 언패킹을 진행해봅시다.



여기 있는 NOP 코드들을.. 



PUSH의 OP Code를 긁어와서.. 



위와 같이 복구해주었습니다.

그런 다음, 바로 올리디 덤프를 이용하여, 언패킹 진행해보았습니다.



엔트리 포인트 다시 잡아주고.. 

언패킹을 진행한 뒤, 다시 올리디버거로 분석을 진행해보았습니다.


[두근두근]


짜잔! 깔끔하게 잘 나오네요 :)

언패킹 성공입니다!


정답은 위에서 넣어준 OPCode가 되겠군요 :)


또한 해당 프로그램을 분석 해본 결과, 


abex.l2c 라는 이름으로

CreateFileA 함수 호출 한 뒤, 해당 결과 값을 기반으로

GetFileSize 함수를 호출,

크기를 비교하여, 크기가 18byte이면 성공이라고 메세지 박스를 띄워주는 프로그램 이였습니다.


그러니.. 파일 이름을 abex.l2c로 해주고, 크기를 18바이트를 맞쳐준다면..


[사사사삵]



[두근두근..]


넵 성공입니다 :)


휴, 이걸로 9번이 공략되었군요 :)