gpt4 book ai didi

gdb - 缓冲区溢出成功,但不应该?

转载 作者:行者123 更新时间:2023-12-05 01:14:22 26 4
gpt4 key购买 nike

这是我的程序,带有易受攻击的字符缓冲区,name[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 怎么可以是 0x41414141 而只有 1 个字节溢出?

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

最佳答案

C 字符串以 NUL 终止,因此您最终会得到一个值为零 (NUL) 的 1 字节溢出。

一字节的 NUL 溢出修改了 $ebp 的保存值,使其指向堆栈中低于它应有的位置。这会导致将不正确的值恢复到 $esp 中,并控制 $eip

请特别注意 ebp 的值。调用后,$ebp的值还是一样,但是它指向的值(main会从栈中恢复的值)已经被调整了,并且指向我们受控缓冲区的中间。

greeting 返回到 main 时,什么也没有发生。然而,当 main 使用 leave 指令恢复堆栈帧时,堆栈指针 $esp 被设置到我们控制的缓冲区的中间。当执行ret指令时,我们就控制了$eip

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

在Strcpy之前

EBP: 0xffffc6e8 --> 0xffffc6f8 --> 0x0 
ESP: 0xffffc54c --> 0xffffc558 --> 0xffffc5c8 --> 0xf63d4e2e
EIP: 0x8048466 (<greeting+25>: call 0x8048320 <strcpy@plt>)

在Strcpy之后

EBP: 0xffffc6e8 --> 0xffffc600 ("raabsaabtaabuaabvaabwaabxaabyaab"...)
ESP: 0xffffc54c --> 0xffffc558 ("aaaabaaacaaadaaaeaaafaaagaaahaaa"...)
EIP: 0x804846b (<greeting+30>: lea eax,[ebp-0x190])

mainleave 之前

EBP: 0xffffc600 ("raabsaabtaabuaabvaabwaabxaabyaab"...)
ESP: 0xffffc6f0 --> 0xffffc9bb ("Mister")
EIP: 0x80484b1 (<main+39>: leave)

离开

EBP: 0x62616172 (b'raab')
ESP: 0xffffc604 ("saabtaabuaabvaabwaabxaabyaabzaac"...)
EIP: 0x80484b2 (<main+40>: ret)

ret 在 main 中

EBP: 0x62616172 (b'raab')
ESP: 0xffffc608 ("taabuaabvaabwaabxaabyaabzaacbaac"...)
EIP: 0x62616173 (b'saab')

关于gdb - 缓冲区溢出成功,但不应该?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25836771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com