0
#include <stdio.h>
#include <stdlib.h>
void badf(int n, char c, char* buffer)
{
    int i;
    for (i=0; i<n; i++)
    {
    buffer[i]=c;
    }

}

void f(int n, char c)
{
    char buffer[16];
    badf(n,c,buffer);
}

void message ()
{
printf("Hello\n");

}

int main()
{
f(32,0x08048411);
    return 0;
}

这是我到目前为止得到的代码(得到了它的基础并坚持下去,这就是为什么有一个 badf 和 f 函数)

目标是程序通过溢出到指令指针来打印 Hello 消息。在Ubuntu中使用数据显示调试器,我相信这个显示的地址是0x0804811。

当我运行程序并使用 x/16x $esp 时,堆栈中的下一个地址仅为 1s(我猜只有最后两位数字来自上面的地址)

想知道的是如何使下一个地址成为完整地址,而不仅仅是最后两位数字。

32 也是从 16(上面定义的缓冲区)+ 8(基指针)+ 8(指令指针)计算出来的

提前感谢您的帮助,因为我知道这个具体问题。

4

1 回答 1

0

不要通过 8 位整数 ( char) 传递地址,而是使用足够宽的类型...... - 至少 32 位。

修改如下:

void badf(int n, unsigned int u, char* buffer)
...

void f(int n, unsigned int u)
...
于 2011-12-08T11:51:41.687 回答