我正在通过我在网上找到的一本书学习计算机安全(这本书很新,放轻松!),有一章教你溢出堆栈。程序中使用的函数是:
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
为一,相应地设置获胜并让我获胜。
目前我正在使用一个快速的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 但都没有成功。非常感谢任何帮助,谢谢!
PS我知道这是一个非常糟糕的学习习惯,但请记住这是关于计算机安全的,我绝不想在本教程之外使用它。