C中的堆栈溢出漏洞

8

这个问题实际上是关于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函数?也就是说,如何向char* c写入string

整个重点在于通过仅运行程序执行unix命令,例如ps等。

我想到过使用ps的十六进制表示来写入EBI指针,并将shell_call的参数列表设置为此值,但这并没有起作用。我还尝试输入argsv参数,并将shell_call的参数列表设置为mainarg_list,但这也没有起作用。

我认为第二个版本应该可以工作,但我相信我没有正确设置新栈帧的参数列表(我是通过将a[8]写为0来执行的,因为它是函数指针的第一部分,并且写入了a[9]=736ca[10]=0000,但这可能不对,因为这些是victim_func的参数。那么我如何访问shell_call的参数?


7
请注意,这是一种缓冲区溢出而不是栈溢出。 - Greg Rogers
1
@Greg Rogers 实际上是的,这是一个堆栈溢出。事实上,在这个应用程序中并没有使用堆。 - rook
@Rook:缓冲区在堆栈上。但缓冲区溢出是漏洞所在。堆栈溢出是不可利用的——否则地球上的每个XML解析器都会有漏洞 ;) - Billy ONeal
@Rook:栈溢出是指堆栈空间耗尽,例如无限递归,并且不可利用。而你在这里遇到的是堆栈中的缓冲区溢出。虽然名称相似,但却是完全不同的问题。 :) - MarioVilas
3个回答

8

我可能不应该为你做作业,但基本上:

你需要在内存中找到一个字符缓冲区来存储要执行的字符串。显然,你可以用和调用其他函数相同的方式进行操作(例如,把文本放在堆栈上)。在你写完之后,你需要在堆栈上写入一个指向它的指针,放在shell_code函数期望找到其参数的位置上。

最好的方法是,在不让我为你完成所有工作的情况下,在一张纸/白板上写下堆栈/内存内容。写下如果从程序内部正常调用shell_code会是什么样子。然后写下在victum_func内部堆栈的样子,并找出要更改的哪些东西,使其看起来像是“自然”(当然要记住有些东西是“不关心”的,比如返回地址)。

这就是今天你能从我这里得到的全部慈善! :-P


2

1

你需要操作调用者(main())的栈帧,并安排它以返回到溢出的victim_func()的尾声中的shell_call(),后者可以找到一个已经被主函数调用时的稳定的栈。

为了做到这一点,你可能需要篡改受害者的栈帧中的帧指针,在通过leave恢复到%ebp。


2
哇,我已经利用了缓冲区溢出,但我不知道你刚才说的是什么。 - rook
@Rook 看起来 @Nicola 使用了那些花哨的马尔可夫链文本生成工具之一。 :P - Mateen Ulhaq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接