На первом листинге происходит запуск и дизассемблирование функции с переполнением:
Code:
$ gdb bof
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-64.el6_5.2)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/ximera/Code/pwnable.kr/bof...(no debugging symbols found)...done.
(gdb) set disassembly-flavor intel
(gdb) disassemble func
Dump of assembler code for function func:
0x0000062c <+0>: push ebp
0x0000062d <+1>: mov ebp,esp
0x0000062f <+3>: sub esp,0x48
0x00000632 <+6>: mov eax,gs:0x14
0x00000638 <+12>: mov DWORD PTR [ebp-0xc],eax
0x0000063b <+15>: xor eax,eax
0x0000063d <+17>: mov DWORD PTR [esp],0x78c
0x00000644 <+24>: call 0x645 <func+25>
0x00000649 <+29>: lea eax,[ebp-0x2c]
0x0000064c <+32>: mov DWORD PTR [esp],eax
0x0000064f <+35>: call 0x650 <func+36>
0x00000654 <+40>: cmp DWORD PTR [ebp+0x8],0xcafebabe
0x0000065b <+47>: jne 0x66b <func+63>
0x0000065d <+49>: mov DWORD PTR [esp],0x79b
0x00000664 <+56>: call 0x665 <func+57>
0x00000669 <+61>: jmp 0x677 <func+75>
0x0000066b <+63>: mov DWORD PTR [esp],0x7a3
0x00000672 <+70>: call 0x673 <func+71>
0x00000677 <+75>: mov eax,DWORD PTR [ebp-0xc]
0x0000067a <+78>: xor eax,DWORD PTR gs:0x14
0x00000681 <+85>: je 0x688 <func+92>
0x00000683 <+87>: call 0x684 <func+88>
0x00000688 <+92>: leave
0x00000689 <+93>: ret
End of assembler dump.
Далее мы ставим бряк на начало этой функции, и запускаем программу на исполнение передавая ей в
stdin файл с нашим шеллом:
Code:
(gdb) b func
Breakpoint 1 at 0x632
(gdb) r < shell
Starting program: /home/ximera/Code/pwnable.kr/bof < shell
Breakpoint 1, 0x00110632 in func ()
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132.el6_5.3.i686
Срабатывает бряк в начале функции, и мы смотрим значение переменной key которая находится в esp+8:
Code:
(gdb) x/x $ebp+8
0xffffcf10: 0xdeadbeef
как мы видим значение переменной
key именно то которое передавалось из
main.
Далее ставим бряк на место сравнения
key со значением
0xcafebabe, и продолжаем трассировку:
Code:
(gdb) b *0x00110654
Breakpoint 2 at 0x110654
(gdb) continue
Continuing.
overflow me :
Breakpoint 2, 0x00110654 in func ()
Видим что произошла остановка не месте сравнения, давайте же посмотрим на значение переменной
key:
Code:
(gdb) x/x $ebp+8
0xffffcf10: 0xcafebabe
производим трассировку дальше и посмотрим что же произойдет:
Code:
(gdb) disassemble func
Dump of assembler code for function func:
0x0011062c <+0>: push ebp
0x0011062d <+1>: mov ebp,esp
0x0011062f <+3>: sub esp,0x48
0x00110632 <+6>: mov eax,gs:0x14
0x00110638 <+12>: mov DWORD PTR [ebp-0xc],eax
0x0011063b <+15>: xor eax,eax
0x0011063d <+17>: mov DWORD PTR [esp],0x11078c
0x00110644 <+24>: call 0xf7e7adb0 <puts>
0x00110649 <+29>: lea eax,[ebp-0x2c]
0x0011064c <+32>: mov DWORD PTR [esp],eax
0x0011064f <+35>: call 0xf7e7a460 <gets>
=> 0x00110654 <+40>: cmp DWORD PTR [ebp+0x8],0xcafebabe
0x0011065b <+47>: jne 0x11066b <func+63>
0x0011065d <+49>: mov DWORD PTR [esp],0x11079b
0x00110664 <+56>: call 0xf7e53210 <system>
0x00110669 <+61>: jmp 0x110677 <func+75>
0x0011066b <+63>: mov DWORD PTR [esp],0x1107a3
0x00110672 <+70>: call 0xf7e7adb0 <puts>
0x00110677 <+75>: mov eax,DWORD PTR [ebp-0xc]
0x0011067a <+78>: xor eax,DWORD PTR gs:0x14
0x00110681 <+85>: je 0x110688 <func+92>
0x00110683 <+87>: call 0xf7f14ef0 <__stack_chk_fail>
0x00110688 <+92>: leave
0x00110689 <+93>: ret
End of assembler dump.
(gdb) si
0x0011065b in func ()
(gdb) si
0x0011065d in func ()
(gdb) si
0x00110664 in func ()
(gdb) disassemble func
Dump of assembler code for function func:
0x0011062c <+0>: push ebp
0x0011062d <+1>: mov ebp,esp
0x0011062f <+3>: sub esp,0x48
0x00110632 <+6>: mov eax,gs:0x14
0x00110638 <+12>: mov DWORD PTR [ebp-0xc],eax
0x0011063b <+15>: xor eax,eax
0x0011063d <+17>: mov DWORD PTR [esp],0x11078c
0x00110644 <+24>: call 0xf7e7adb0 <puts>
0x00110649 <+29>: lea eax,[ebp-0x2c]
0x0011064c <+32>: mov DWORD PTR [esp],eax
0x0011064f <+35>: call 0xf7e7a460 <gets>
0x00110654 <+40>: cmp DWORD PTR [ebp+0x8],0xcafebabe
0x0011065b <+47>: jne 0x11066b <func+63>
0x0011065d <+49>: mov DWORD PTR [esp],0x11079b
=> 0x00110664 <+56>: call 0xf7e53210 <system>
0x00110669 <+61>: jmp 0x110677 <func+75>
0x0011066b <+63>: mov DWORD PTR [esp],0x1107a3
0x00110672 <+70>: call 0xf7e7adb0 <puts>
0x00110677 <+75>: mov eax,DWORD PTR [ebp-0xc]
0x0011067a <+78>: xor eax,DWORD PTR gs:0x14
0x00110681 <+85>: je 0x110688 <func+92>
0x00110683 <+87>: call 0xf7f14ef0 <__stack_chk_fail>
0x00110688 <+92>: leave
0x00110689 <+93>: ret
End of assembler dump.
Мы видим что должен произойти вызов функции system("/bin/sh"), ставим бряк на конец функции и запускаем трассировку. Получаем пичальку:
Code:
(gdb) b *0x00110688
Breakpoint 3 at 0x110688
(gdb) continue
Continuing.
Detaching after fork from child process 1928.
*** stack smashing detected ***: /home/ximera/Code/pwnable.kr/bof terminated
Program received signal SIGSEGV, Segmentation fault.
0xf7fd1d16 in ?? () from /lib/libgcc_s.so.1
Missing separate debuginfos, use: debuginfo-install libgcc-4.4.7-4.el6.i686
(gdb) continue
Continuing.
Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.