CodeEngn basic 09

코드엔진 basic 09번 문제풀이

일단 프로그램을 실행해 보면 아래와 같은 창을 볼 수 있다.

basic9 basic9-1

확인 버튼을 누르면 에러 창이 뜨는 것을 볼 수 있다.

이제 PE View를 사용해서 파일을 열어보면 아래와 같이 upx로 패킹 된 것을 볼 수 있다.

basic9-2

패킹이 되있는 것을 확인하였으니 언패킹을 한 뒤 프로그램을 다시 실행해 보면 아래와 같이 문자가 깨지는 것을 볼 수 있다.

basic9-3

이제 올리디버거를 사용하여 프로그램을 열어보면 OEP구간에 MessageBoxA함수의 파라미터가 비어있는 것을 볼 수 있다.

basic9-4

이 챕터를 진행하면서 StolenByte라는 것의 개념을 배우게 되었다. StolenByte란 언패킹을 어렵게 하기 위해 패커가 코드 몇 개를 훔쳐 이동시킨 다는 의미였다. 그래서 패킹된 파일을 다시 올리 디버거로 열어 코드를 찾아보면 아래와 같이 POPAD 아래에 3개의 push가 있는 것을 확인하였다.

(OEP로 점프하는 구문 위에 있는 것으로 보고 판단)

basic9-5

이제 이 코드를 옮긴 뒤 New Origin here를 사용해 EIP를 401000으로 옮긴 뒤 프로그램을 천천히 실행해보면 정상적인 메시지가 나오는 것을 볼 수 있다.

basic9-6

StolenByte를 구하는 문제였고 OP코드 형식으로 답하라고 하였으므로 정답은 6A0068002040006812204000이다.

프로그램의 뒷부분은 Createfile을 사용해 abex.l2c파일이 있는지 확인하여 있으면 프로그램을 열고 없으면 -1을 반환하여 에러 메시지가 나오게 한다. 그 후 GetfileSize함수를 사용해 파일의 크기를 가져온 뒤 12h(10진수 18)바이트와 같은지 검사한 뒤 같으면 well done 다르면 에러 메시지를 나타나게 한다.

StolenByte라는 것에 대하여 배울 수 있었던 재밌는 문제였다. 삽질도 엄청 했다.