먼저, exe
파일을 실행하면 오른쪽 창과 같은 메시지 박스를 띄운다.
하드디스크를 CD-Rom
으로 인식하라고 한다. Ok
를 클릭.
CD-ROM이 아니라고 뜬다. 리버싱을 통해 어떤 로직으로 검증하는지 확인해보자.
x86dbg
에 exe
파일을 올렸다. EP(Entry Point)
부터 코드를 실행하기 위해 System Breakpoint
를 체크해제했다. 이후, ctrl+F2
로 프로그램을 재실행한다.
브레이크 포인트에 걸렸고, 현재 EP
에 머무르고 있다. 간단한 코드기 때문에 어셈블리어를 알면 금방 이해할 수 있다.
1. 빨간색 박스에서 cmp eax, esi
하고, 동일하다면 0x40103d
로 jmp
한다.
2. 0x40103d
부터 문제를 해결하면 뜨는 메시지 박스에 문자를 스택에 push
하고 MessageBoxA
함수를 호출하여 메시지를 띄운다.
그렇다면, cmp eax, esi
부분에서 어떤 것을 비교하는지 확인해보자.
eax
는 함수의 리턴 값을 저장하기 때문에, call <JMP.&GetDriveTypeA>
부분의 리턴 값 부터 확인했다. 위 사진에 오른쪽을 보면 함수 리턴 후 eax
의 값은 3
이고, esi
의 값은 0x401000
이다.
inc esi
가 실행되고, esi
가 0x401001
로 바뀌었다.
dec eax
로 인해 값이 3이었던 eax
가 2가 되었다.
이와 같이 한줄씩 우리가 보고자하는 cmp eax, esi
까지 내려가보자.
esi
가 0x401003
이고, 이때 eax
는 1
이기 때문에 값이 다르기 때문에 je(Jump if Equal)
의 jmp
가 되지 않고 지나간다.
따라서, 조건에 맞춰 점프하는 je
가 아닌 무조건 점프하는 jmp
로 패치하면 원하는 메시지창을 띄울 수 있다.
왼쪽에 파란색 jmp
선이 생긴 것을 볼 수 있다. 계속 따라서 실행해보자.
처음과 다른 메시지 창이 나왔다. WOW!
Uploaded by N2T