c ++中的故意缓冲区溢出

时间:2015-09-29 06:53:40

标签: c++ buffer overflow conditional

我非常确定我这样做是正确的,我已经遵循了许多教程,但无法让这个例子为我工作。 我的目标是致电'秘密'

所以我有这个c ++程序:

function getLocation(cb) {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function (position) {
            var geo_param = "geolocation=[" + position.coords.latitude + "," + position.coords.longitude + "]";
            if (typeof cb === 'function') {
                cb(geo_param);
            }
        });
    }
}
function search(activity) {
    getLocation(function (geo_param) {
        window.location.href = "/s?activity=" + activity + "&" + geo_param;
    });
}

然后我将它输入gdb并运行它,溢出缓冲区直到我得到:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

void secret() {
    printf( "You Won!");
}
int check(char *name) {
    char buffer[16];

    strcpy( buffer, name );

    printf( "Your name is: %s \n", buffer);
    srand(time(NULL));

    return rand();
}
int main(int argc, char **argv) {
    int randnum;
    randnum = check(argv[1]);
    if(randnum < 5) {
        secret();
    } else {
        return( 0 );
    }

return( 0 );
}

所以CCCC是返回地址。所以在gdb中我运行了'disas main&#39;返回:

(gdb) run AAAABBBBAAAABBBBAAAABBBBAAAACCCC
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: ... AAAABBBBAAAABBBBAAAABBBBAAAACCCC
Your name is: AAAABBBBAAAABBBBAAAABBBBAAAACCCC 
The buffer address is [0xffffd960].

Program received signal SIGSEGV, Segmentation fault.
0x43434343 in ?? ()

所以我尝试输入:( gdb)运行$(perl -e&#39; print&#34; A&#34; x28。&#34; \ xab \ x84 \ x04 \ x08&#34; x1&# 39)

我得到了:

编程接收信号SIGSEGV,分段故障。 0xffffdb00在?? ?? ()

为什么这不起作用?是否有可能将条件溢出为真实的?

1 个答案:

答案 0 :(得分:0)

编辑:我假设您正在学习安全性并尝试缓冲区溢出。您可能想要向其他人澄清您并不是在尝试编写类似的程序。

你正在做的事情似乎是正确的,我认为secret函数被调用,但程序从它返回时崩溃。 "You Won!"文本未打印出来,因为它没有从某个缓冲区中刷新。您可以尝试在secret函数上放置断点,您应该看到它正被调用。您还可以在字符串末尾添加新行\n,以帮助在程序死亡之前将其清除。

如果您想让secret发生,然后正确退出程序,则需要更复杂的输入数据。