【发布时间】:2010-09-22 02:44:27
【问题描述】:
问题实际上是关于 C 中的堆栈溢出。 我有一个我一辈子都做不完的任务,我查看了 gdb 中的所有内容,但我就是想不通。
问题如下:
int i,n;
void confused()
{
printf("who called me");
exit(0);
}
void shell_call(char *c)
{
printf(" ***Now calling \"%s\" shell command *** \n",c);
system(c);
exit(0);
}
void victim_func()
{
int a[4];
printf("[8]:%x\n", &a[8]);
printf("Enter n: "); scanf("%d",&n);
printf("Enter %d HEX Values \n",n);
for(i=0;i<n;i++) scanf("%x",&a[i]);
printf("Done reading junk numbers\n");
}
int main()
{
printf("ls=736c --- ps = 7370 --- cal = 6c6163\n");
printf("location of confused %x \n", confused);
printf("location of shell_call %x \n", shell_call);
victim_func();
printf("Done, thank you\n");
}
好的,所以我设法正确回答了第一个问题,即任意调用主路径中未显式调用的两个函数之一。顺便说一句,这必须在运行程序时完成,无需任何修改。
我通过运行程序来做到这一点,将N设置为7,这使我指向victim_func帧的函数指针,我用混淆或shell_call的内存地址写a[7],它可以工作. (我有一台 64 位机器,这就是为什么我必须将其设置为 7,因为 EBI 指针是 2 个整数宽,而不是 1)
我的问题如下,我如何控制将哪个参数传递给shell_code 函数? IE。我如何将string 写到char* c。
重点是通过仅运行程序来执行 ps 等 unix 命令。
我想用 ps 的十六进制表示来编写 EBI 指针,并将 shell_call 的 arg 列表设置为此,但这不起作用。我还尝试输入argsv 参数并将shell_call 的arg 列表设置为main 的arg_list,但也没有用。
我认为第二个版本应该可以工作,但我认为我没有正确设置新堆栈帧的 arg 列表(我通过将 a[8] 写入 0 来做到这一点,因为它是函数的第一部分指针,并写a[9]=736c和a[10]=0000,但可能不对,因为这些是victim_func的参数。那么如何访问shell_call的参数呢?
【问题讨论】:
-
注意这是缓冲区溢出,而不是栈溢出。
-
@Greg Rogers 实际上是的,这是堆栈溢出。实际上,此应用程序中没有使用堆。
-
@Rook:缓冲区在堆栈上。但是缓冲区溢出是漏洞。堆栈溢出是不可利用的——否则地球上的每个 XML 解析器都会受到攻击;)
-
@Rook:堆栈溢出意味着耗尽堆栈空间,例如无限递归,并且不可利用。您在这里拥有的是堆栈中的缓冲区溢出。它的名字类似,但完全不同的野兽。 :)
标签: c stack-overflow buffer-overflow exploit