C++ 由于试图产生缓冲区溢出,堆栈完全混乱

C++ 由于试图产生缓冲区溢出,堆栈完全混乱,c++,gcc,gdb,stack,buffer-overflow,C++,Gcc,Gdb,Stack,Buffer Overflow,经过数小时的调试,我希望能在StackOverflow上找到一些帮助 我目前正在接受PTP培训,由于我只使用Linux,我还想在我的本地机器上练习firsts Labs 我要做的是通过缓冲区溢出利用一个非常简单的程序。仅给出了来源: goodpwd.cpp: #包括 #包括 int bf_溢出(字符*str){ 字符缓冲区[10];//我们的缓冲区 strcpy(buffer,str);//易受攻击的命令 返回0; } int good_password(){//一个从未执行过的函数 print

经过数小时的调试,我希望能在StackOverflow上找到一些帮助

我目前正在接受PTP培训,由于我只使用Linux,我还想在我的本地机器上练习firsts Labs

我要做的是通过缓冲区溢出利用一个非常简单的程序。仅给出了来源:

goodpwd.cpp:

#包括
#包括
int bf_溢出(字符*str){
字符缓冲区[10];//我们的缓冲区
strcpy(buffer,str);//易受攻击的命令
返回0;
}
int good_password(){//一个从未执行过的函数
printf(“提供的有效密码”);
printf(“这是一个很好的密码函数\n”);
返回0;
}
int main(int argc,char*argv[])
{
int password=0;//控制密码是否有效
printf(“您现在在goodpwd.exe中\n”);
bf_溢出(argv[1]);//调用函数并传递用户输入
如果(密码==1){
好的_password();//这永远不会发生
}
否则{
printf(“无效密码!!!\n”);
}
printf(“退出sample1.exe\n”);
返回0;
}
我使用

gcc-fno stack protector-z execstack-o goodpwd goodpwd.cpp-ggdb-m32-lstdc++-no pie-O0
(我也试过了,没有
-no pie
-O0
,但我认为优化可能是问题所在。)

我使用
gdb
调试可执行文件:

gdb goodpwd-tui-q
在将断点设置为第6行(带有易受攻击strcpy的那一行)后,我执行了以下命令:

(gdb) run AAAAAAAAAAAAAABCDE
n
转到下一行后,我查看了堆栈:

(gdb) x/20x $esp
这给了我以下结果:

0xffffd6f0:     0xffffd748      0x4141a8b0      0x41414141      0x41414141
0xffffd700:     0x41414141      0x45444342      0xffffd700      0x0804923b
0xffffd710:     0xffffd99c      0xf7fe4bd0      0xffffd800      0x08049209
0xffffd720:     0x00000002      0xffffd7f4      0xffffd800      0x00000000
0xffffd730:     0x0804c000      0x00000002      0x08049080      0xffffd760
我无法解释为什么:

  • 0xffffd6f4有两个A
  • 0xffffd6f6上没有A
  • 我从0xffffd6f8开始有16个A
  • 我在0xffffd704获得了EDCB(因为little endian,谢谢@1201程序)
  • $bsp是0xffffd708,$eip是0x80491a7,但在执行了两个步骤(离开函数)之后,$eip被设置为0x804923e,因为在我了解了所有内容之后,我非常确定它应该是0x08049209
  • 在这两个步骤之后,我得到了这些错误:
    main(argc=,
    argv=)在goodpwd.cpp:21
如果有人能帮助我,我将不胜感激。 在43单元的第3单元中苦苦挣扎并不是我有过的最好的感觉:D

编辑: 应停用ASLR:

echo 0 | sudo tee/proc/sys/kernel/randomize\u va__空间

也许昨天有点晚了。但今天我发现,@1202programalam提出了一个非常好的观点

由于使用了一个小的endian系统,0xffffd704是正确的。 我对0xffffd6f4和0xffffd6f6的混淆与此无关,因为它们不会影响结果

旧的$EIP的值仍然是0xffffd70e,但我从未碰过它。 我只需要增强参数中的字符串,然后就可以利用该漏洞。
这很有趣。感谢您的建议。

这是一个因素吗?“堆栈由于试图产生缓冲区溢出而完全混乱”-有趣的标题。。。提示:使用
valgrind
-它给出提示,如上下文1中的
==868609==1错误:==868609==大小1的无效读取==868609==at 0x483CD34:strcpy(vg_replace_stremm.c:513)==868609==by 0x4019F:main(in/home/ted/proj/stackoverflow/title clang)==868609==地址0x0不是堆栈、malloc'd或(最近)free'd
你正在显示little endian dwords。@tadman:我停用了它(并更新了帖子,谢谢:)@1201程序你完全正确。这解释了“EDCB”模式,可能还有一点0xffffd6f4处的值。但只是一点点:)