Lena tutorial의 3,4번 문제의 목표는 다음과 같습니다.
파일 구성은 다음과 같이 되어있습니다.
이번 문제는 registerMe.exe 파일을 patch 하여 Nag를 제거 하는 것입니다. 실행을 하면 다음과 같이
해당 어셈코드를 보면 위에 창을 나타내는 부분들이 하나씩 보입니다. 이제 entry point의 코드를 보면
다음과 같이 GetModuleHandleA라는 함수를 실행하고 함수의 결과 값이 0인지 비교합니다. 하지만 GetModuleHandleA는 해당 프로세스가 메모리에 매핑된 주소를 찾는것으로 이는 항상 0x00400000이므로 그 아래의 JE는 항상 jmp가 되지 않습니다. 따라서 이부분을 jmp로 바꾸어주어 첫번째 Nag를 우회하거나 entry point 자체를 바꾸어 해결 할 수 있습니다.
JE가 실행되지 않는다면 다음과 같이 첫번째 창이 뜨게 됩니다. 따라서 entry point를 olly를 통해 바꾸어 주겠습니다.
다음과 같이 memory를 확인해보면 RegisterMe.exe의 PE 구조를 볼 수 있고 여기에서 entry point와 entry point가 memory에 어디에 위치해 있는지 알 수 있습니다. 이제 이를 토대로 entry point의 정보가 있는 memory를 수정해야합니다.
entry point를 messageBox가 실행되는 다음으로 설정하면 될 것 같습니다.
이제 address를 찾아가서 entry point의 정보를 수정해줍니다.
0x00001000 -> 0x00001024
그 이후 마지막 창을 제거하려고 보니 jmp문이 없으므로 전부 Nop으로 채웠습니다.
이제 이 파일을 저장하여 crack을 만들었고
디음 창만 뜨게 만들었습니다. 이제 다음으로 같이 있던 파일인 RegisterMe.Oops.exe만 해결하면 됩니다.
ollydbg에서 파일을 확인하려하니 다음과 같이 PE파일이 아니라는 에러메시지가 나오고 알 수 없는 위치에서 디버깅을 하게 됩니다. 하지만 실행 결과는 RegisterME.exe와 다를게 없습니다.
이는 PE파일이 손상된 것으로 RegisterMe.exe와 같은 동작을 하므로 hxd로 RegisterMe.exe와 같아지도록 hex를 수정해주면 됩니다.
다음과 같이 HxD를 사용하여 두 파일을 비교하여 수정을 해주면 됩니다. 수정을 한 부분은 다음과 같습니다.
Size of Code(0xDC) : 0x40000400 -> 0x00000400
Size of Initialized Data(0xE0) : 0x40000A00 -> 0x00000A00
Address of Entry Point(0xE8) : 0x00001000 -> 0x00001052
Base of Code(0xEC) : 0x40001000 -> 0x00001000
Base of Data(0xF0) : 0x40002000 -> 0x00002000
Number of Data Directories(0x134) : 0x40000004 -> 0x00000010
EXPORT Table RVA(0x138) : 0x00500000 -> 0x00000000
EXPORT Table Size(0x13C) : 0x00500000 -> 0x00000000
해당 부분들을 수정하여 다시 ollydbg로 확인하니 정상 실행되었고 이후 위와 같은 방식으로 해결하였습니다.