본문 바로가기
Study/Reversing

nag 제거, PE 헤더

by Melpin 2015. 5. 21.

tuts4you 에 있는 Lena 라는 제작자가 40장 정도의 분략으로 플래시 강좌를 만들어 놓은 것을 검색으로 찾을 수 있다.

3번 강좌에 있는 RegisterMe.exe 와 RegisterMe.Oops.exe 프로그램을 실행시켜보면 다음과 같은 nag 창이 나오는 것을 볼 수 있다.



그리고 프로그램이 종료될 때 다시한번 nag 창이 나온다.


총 2곳 존재한다.

nag 메세지 박스가 나오는 부분을 강제로 jump 시켜 nag 창이 나오지 않도록 할 수 있지만. 

PE구조의 EP 주소를 수정하여 nag 가 뜨는 부분과 만나지 않도록 수정해 보자.


M(Memory Map) 으로 표시된 버튼을 클릭해서 PE 헤더 부분을 확인해 보자.


00400000 주소의 사이즈가 1000(16진수)까지가 PE 헤더이다. 해당 라인에서 더블클릭 하면 DUMP 창이 나타나고, DOS헤더 구조를 볼 수 있다.




그리고 좀더 내려보면 PE signature 부분도 볼 수 있다.




ImageBase 값에서 OEP(AddressOfEntryPoint) 값을 더해서 시작하게 되어 00401000 주소에서 코드가 실행된다.

시작되는 지점을 수정해서 첫 번째 nag 창을 제거할 것이므로 Memory Map 창에서 PE 덤프를 하여 나타난 OEP 주소지를 클립보드에 복사해 Hex dump 창에서

CTRL + G 기능으로 확인해본다.



화면과 같이 덤프된 hex 값이 00 10 00 00 값을 Binary > edit 으로 24 10 00 00 으로 바꿔 준다.

그렇게되면 AddressOfEntryPoint = 1024 로 바뀌게 된다. (리틀엔디안 방식이기 때문에)

그럼 시작지점이 00401024 지점부터 프로그램이 시작되기 때문에 시작할때의 nag 창이 나오지 않게 된다.


이제 시작할때의 nag창을 제거했으니 종료할때의 nag 창을 지워보자

back to user mode 로 종료될때의 nag박스 위치를 찾아보자.



MessageBoxA 가 실행되면서 nag 창이 나오는것을 알 수 있다.

PUSH 0 부터 Call MessageBoxA 를 하는 곳까지 블록 선택하고, Binary > Fill with Nops 로 메세지 박스 출력부분을 제거한 뒤

Copy to executable > All modifications 를 선택한 뒤 Save To File 기능으로 저장을 하면

모든 nag 창을 제거한 것을 볼 수 있다.


RegisterMe.Oops.exe 파일을 올리디버거로 열어보면 다음과 같은 문구가 나타난다.


확인을 누르면 이상한 주소지가 선택되어서 디버거가 실행될 것이다.

이 문제는 PE구조를 꼬아놓은 경우로, 수작업으로 수정하거나 자동으로 PE구조를 보정해주는 플러그인을 이용해 PE구조를 보정할 수 있다.


Memory Map을 통해서 PE header 로 간뒤 Dump 창을 보면 일반적인 PE header 의 길이는 1000인대 5000 으로 되어 있는 것을 볼 수 있다.



Image Base 와 OEP 의 합산인 00401000의 위치를 CPU에서 검색한 뒤 그 위치에 Break Point를 걸어두면 올리디버거가 혼란스러워 한다.


예 를 눌러서 Break Point 지점을 설정해준 뒤 보면

PE 구조가 잘못 되어 있더라도 시작 시점까지 로드가 되었기 때문에 이 상태의 Memory Map 을 열어서 다시 PE 구조를 확인해 보면 아까와 다르게 나타난다.

PE 사이즈가 5000 으로 되어 있는것을 볼 수 있다.

이상한 부분과 수정해야 할 값을 정리해 보면 다음과 같이 NumberOfRvaAndSizes 를 제외하고 사이즈 값을 크게 늘려놓은 것을 복원하는 것이다.


004000DC    00040040    DD 40000400          ;  SizeOfCode = 40000400 (1073742848.)    >> 400

004000E0    000A0040    DD 40000A00          ;  SizeOfInitializedData = 40000A00 (1073744384.) >> A00

004000EC    00100040    DD 40001000          ;  BaseOfCode = 40001000 >> 1000

004000F0    00200040    DD 40002000          ;  BaseOfData = 40002000 >> 2000

00400134    04000040    DD 40000004          ;  NumberOfRvaAndSizes = 40000004 (1073741828.) >> 10

00400138    00005000    DD 00500000          ;  Export Table address = 500000 >> 0

0040013C    00000500    DD 00050000          ;  Export Table size = 50000 (327680.) > 0

으로 수정하면 기존의 nag창이 동일하게 나타나는것을 볼 수 있다.


tuts4you에 있는 Olly Advanced 를 다운받아 plugin 을 이용하면 꼬아놓은 PE헤더를 탐지하고 바로 풀어주는 기능이있다.

'Study > Reversing' 카테고리의 다른 글

crackme3  (0) 2015.05.26
crackme2  (0) 2015.05.25
KeyFile 체크 문제 풀이, 바이너리 수정  (0) 2015.05.19
키젠문제 풀이  (0) 2015.05.18
Unpack, Back To User mode  (0) 2015.05.18

댓글