Gdb 缓冲区溢出成功,但不应';不会吧?

Gdb 缓冲区溢出成功,但不应';不会吧?,gdb,stack,buffer-overflow,Gdb,Stack,Buffer Overflow,这是我的程序,带有易受攻击的字符缓冲区,名称为[400] void greeting(char *temp1,char *temp2) { char name[400]; strcpy(name,temp2); printf("Hello %s %s\n", temp1, name); } int main(int argc,char *argv[]) { greeting(argv[1],argv[2]); return 0; } 在禁用ASLR的L

这是我的程序,带有易受攻击的字符缓冲区,名称为[400]

void greeting(char *temp1,char *temp2)
{
    char name[400];
    strcpy(name,temp2);
    printf("Hello %s %s\n", temp1, name);
}

int main(int argc,char *argv[])
{
    greeting(argv[1],argv[2]);
    return 0;
}
在禁用ASLR的Linux(64位)上编译如下:

gcc -m32 -ggdb -fno-stack-protector -mpreferred-stack-boundary=2 -z execstack -o buffer buffer.c

(gdb) run Mr `perl -e 'print "A" x 400'`
Hello Mr AAAAAAA.... (truncated)
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()

(gdb) info reg eip ebp
eip            0x41414141
ebp            0x41414141
我在这里假设添加了一个空字节,导致溢出,但我不明白的是,EIP如何可以是0x4141,而只有一个字节溢出


编辑:在使用gdb进行更多探测之后,没有添加空字节,并且当只输入400字节时,根本没有溢出。那么,我的EIP如何最终指向我的缓冲区内容而不发生任何溢出呢?我假设缺少空字节会导致printf()出现问题。

C字符串被
NUL
终止,因此最终会出现值为零的1字节溢出(
NUL

单字节
NUL
溢出会修改
$ebp
的保存值,使其在堆栈上的位置低于应有的位置。这会导致将不正确的值还原到
$esp
,并控制
$eip

特别注意
ebp
的值。调用后,
$ebp
的值仍然相同,但它所指向的值(
main
将从堆栈中恢复的值)已被调整,并指向受控缓冲区的中间

问候语
返回到main时,不会发生任何事情。但是,当
main
使用
leave
指令恢复堆栈帧时,堆栈指针
$esp
被设置到受控缓冲区的中间。执行
ret
指令时,我们可以控制
$eip

注意,我使用了由而不是标准
AAAAA
生成的循环模式,因为我们可以使用它来计算偏移量。例如,“aaaa”=>0,“aaab”=>1,“aaba”=>2

Strcpy之前 在
之后,将
留在main中

“没有添加空字节”?我不熟悉perl,认为它可能会在输入字符串中添加空字节,这会导致溢出(400+1)。虽然用gdb检查了内存,我甚至没有使缓冲区溢出,但我的EIP仍然以0x4141结束。C字符串以null结尾。你真是太过分了。
EBP: 0xffffc6e8 --> 0xffffc6f8 --> 0x0 
ESP: 0xffffc54c --> 0xffffc558 --> 0xffffc5c8 --> 0xf63d4e2e 
EIP: 0x8048466 (<greeting+25>:  call   0x8048320 <strcpy@plt>)
EBP: 0xffffc6e8 --> 0xffffc600 ("raabsaabtaabuaabvaabwaabxaabyaab"...)
ESP: 0xffffc54c --> 0xffffc558 ("aaaabaaacaaadaaaeaaafaaagaaahaaa"...)
EIP: 0x804846b (<greeting+30>:  lea    eax,[ebp-0x190])
EBP: 0xffffc600 ("raabsaabtaabuaabvaabwaabxaabyaab"...)
ESP: 0xffffc6f0 --> 0xffffc9bb ("Mister")
EIP: 0x80484b1 (<main+39>:      leave)
EBP: 0x62616172 (b'raab')
ESP: 0xffffc604 ("saabtaabuaabvaabwaabxaabyaabzaac"...)
EIP: 0x80484b2 (<main+40>:      ret)
EBP: 0x62616172 (b'raab')
ESP: 0xffffc608 ("taabuaabvaabwaabxaabyaabzaacbaac"...)
EIP: 0x62616173 (b'saab')