CodeEngn Reversing Basic_Level09

실행해 보았다.


프로그램은 keyfile이 없다는 에러메시지를 띄운다. 따로 입력 값이 없는 것을 보아 key가 있는 keyfile을 필요로 한다는 것을 예상할 수 있다.
PEiD로 조사해 보았다.

UPX 패킹이 되어있다. 언팩하고 다시 PEiD에 넣어보자.

더 이상의 패킹은 없는 것 같다. 올리 디버거로 돌려보자.

코드가 이상하다. NOP으로 차 있다. 실행시키면 다음과 같은 이상한 창이 뜬다.

아무래도 Stolen Byte는 없어진 코드를 의미하는 것 같다. 패킹을 해제한 뒤 이상이 생겼으므로 다시 패킹을 해제하지 않은 원본 파일을 받아서 돌려보자.

UPX패킹이 걸려있지만 프로그램을 이용하여 해제할 수 없으니 수동으로 확인해야 한다.

하드웨어 bp를 걸고 실행하면 POPAD한 뒤 멈춘다. 보통 레지스터를 복원한 뒤 바로 OEP로 점프하는데, 여기에는 이상한 코드가 있다.
언팩시 깨져서 나오던 문자열들이 push되고 있다. 이 부분이 stolen byte로 보인다.
밑의 LEA ~ 코드도 필요한 코드일까? 돌려본 결과 스택에 0을 넣어 초기화하는 것으로 보인다. 그리고 스택을 조정하는 것 같다.
JMP 후의 스택을 보면,

위와 같이 Click OK~ 문자열까지만 push된 것을 볼 수 있다. 즉 없어진 코드는 함수 인자를 push하는 부분인, 6A0068002040006812204000이다. 언팩한 코드에 이 코드를 넣어보자.

실행하면 정상 작동이 되는 것을 확인할 수 있다.
이제 프로그램문제를 풀어보자. 프로그램은 keyfile을 요구한다. 파일이 없으면 에러메시지를 낸다.
그렇다면 열고자 하는 파일과 같은 이름의 파일을 만들어보자.

파일을 여는 함수이다. 바로 아래에서 EAX의 값을 체크하는데, -1이면 오류메시지를 띄우는 코드로 점프한다. abex.l2c가 열고자 하는 파일 이름이다. 똑같은 이름으로 파일을 만들어보자.

첫 번째 오류메시지는 뜨지 않지만 새로운 에러가 뜬다. 이 에러메시지에 대해 알아보자.

파일을 여는 것을 성공하면 GetFileSize 함수를 이용하여 파일의 크기를 얻는다. 그리고 그것을 0x12(16진수에 주의하자)와 비교한다. EAX의 값과 0x12가 같지 않으면 오류 메시지로 분기한다.
즉, 파일에는 0x12 사이즈의 내용이 있어야 한다. 파일에 18개의 아무 알파벳을 쓰면 통과하여 성공 메시지를 띄운다.

tags: writeup, reversing, pe file, windows, packing, upx packer, keygen, x86asm