【问题标题】:Stack Overflow Exploit in CC中的堆栈溢出利用
【发布时间】: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]=736ca[10]=0000,但可能不对,因为这些是victim_func的参数。那么如何访问shell_call的参数呢?

【问题讨论】:

  • 注意这是缓冲区溢出,而不是溢出。
  • @Greg Rogers 实际上是的,这是堆栈溢出。实际上,此应用程序中没有使用堆。
  • @Rook:缓冲区在堆栈上。但是缓冲区溢出是漏洞。堆栈溢出是不可利用的——否则地球上的每个 XML 解析器都会受到攻击;)
  • @Rook:堆栈溢出意味着耗尽堆栈空间,例如无限递归,并且不可利用。您在这里拥有的是堆栈中的缓冲区溢出。它的名字类似,但完全不同的野兽。 :)

标签: c stack-overflow buffer-overflow exploit


【解决方案1】:

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

您需要在内存中的某处获取一个字符缓冲区来存储您要执行的字符串。显然,您可以像调用其他函数一样执行此操作(即将文本也放入堆栈)。写完之后,您需要将指向它的指针写入堆栈中 shell_code 函数期望找到其参数的位置。

在不让我为您完成所有工作的情况下解决这个问题的最佳方法是在一张纸/白板上写下您的堆栈/内存内容。写下如果你从程序内部正常调用 shell_code 的样子。然后写下 victum_func 中的堆栈是什么样子,并弄清楚要更改哪些内容以使其看起来“自然”(当然请记住,有些事情是“无关紧要的”,例如返回地址)。

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

【讨论】:

    【解决方案2】:

    您需要操作调用者 (main()) 的堆栈帧,并将其安排为从溢出的victim_func() 的结尾返回shell_call(),后者可以找到一个稳定的堆栈为它被主要调用。

    这样做你可能不得不破坏受害者堆栈帧中的帧指针,它将通过leave在%ebp中恢复。

    【讨论】:

    • 哇,我利用了缓冲区溢出,我不知道你刚才说了什么。
    • @Rook 看起来@Nicola 使用了其中一种花哨的马尔可夫链文本生成器。 :P
    【解决方案3】:

    SoapBox 已经很好地引导您朝着正确的方向前进。

    更多信息; http://www.skullsecurity.org/wiki/index.php/Example_4

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-28
      • 2012-12-20
      • 2011-03-02
      • 2014-01-17
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      相关资源
      最近更新 更多