两个程序的源代码在帖子末尾
所以,我一直在研究黑客:剥削的艺术,到目前为止一切都很好。我已经设法在易受攻击的程序 notesearch.c 中控制 EIP。
gdb-peda$ run $(perl -e 'print "a"x112 . "bbbb"')
Starting program: /root/hacking/booksrc/notesearch $(perl -e 'print "a"x112 . "bbbb"')
[DEBUG] found a 5 byte note for user id 0
[DEBUG] found a 7 byte note for user id 0
-------[ end of note data ]-------
Program received signal SIGSEGV, Segmentation fault.
[----------------------------------registers---------------------------------- -]
EAX: 0x0
EBX: 0x0
ECX: 0xbffff300 ('a' <repeats 36 times>, "\003")
EDX: 0x0
ESI: 0x2
EDI: 0xb7fb5000 --> 0x1b3db0
EBP: 0x0
ESP: 0xbffff300 ('a' <repeats 36 times>, "\003")
EIP: 0x61616161 ('aaaa')
EFLAGS: 0x10286 (carry PARITY adjust zero SIGN trap INTERRUPT direction overflow)
[-------------------------------------code------------------------------------ -]
Invalid $PC address: 0x61616161
[------------------------------------stack------------------------------------ -]
0000| 0xbffff300 ('a' <repeats 36 times>, "\003")
0004| 0xbffff304 ('a' <repeats 32 times>, "\003")
0008| 0xbffff308 ('a' <repeats 28 times>, "\003")
0012| 0xbffff30c ('a' <repeats 24 times>, "\003")
0016| 0xbffff310 ('a' <repeats 20 times>, "\003")
0020| 0xbffff314 ('a' <repeats 16 times>, "\003")
0024| 0xbffff318 ('a' <repeats 12 times>, "\003")
0028| 0xbffff31c ("aaaaaaaa\003")
[----------------------------------------------------------------------------- -]
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
0x61616161 in ?? ()
gdb-peda$
但是,一旦我编写了自己的非常简单的错误代码并尝试控制 EIP,就会发生这种情况
gdb-peda$ run
Starting program: /root/vulnerable
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbbbb
Program received signal SIGSEGV, Segmentation fault.
[----------------------------------registers-----------------------------------]
EAX: 0x0
EBX: 0x0
ECX: 0x41414141 ('AAAA')
EDX: 0xb7fb687c --> 0x0
ESI: 0x1
EDI: 0xb7fb5000 --> 0x1b3db0
EBP: 0x41414141 ('AAAA')
ESP: 0x4141413d ('=AAA')
EIP: 0x804841d (<main+50>: ret)
EFLAGS: 0x10282 (carry parity adjust zero SIGN trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
0x8048416 <main+43>: mov ecx,DWORD PTR [ebp-0x4]
0x8048419 <main+46>: leave
0x804841a <main+47>: lea esp,[ecx-0x4]
=> 0x804841d <main+50>: ret
0x804841e: xchg ax,ax
0x8048420 <__libc_csu_init>: push ebp
0x8048421 <__libc_csu_init+1>: push edi
0x8048422 <__libc_csu_init+2>: push esi
[------------------------------------stack-------------------------------------]
Invalid $SP address: 0x4141413d
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
0x0804841d in main ()
gdb-peda$ p/x $eip
$1 = 0x804841d
gdb-peda$
我什么都没有,ESP不应该保持不变(因为它没有存储在堆栈中)并且EIP被覆盖了吗?
你可以找到 notesearch.c @ https://github.com/intere/hacking 下面是我所谓的“可利用”程序。
不用说,我禁用了 ASLR,并且程序是使用 -fno-stack-protector 和 -zexecstack 标志编译的。如果您需要更多信息,请发表评论。
#include <stdio.h>
int main(){
char *buffer[64];
gets(buffer);
return 0;
}