shellcode的生成方法指导书上已经写得很详细了,在作实验时我直接用的是老师上课用的shellcode:linux
将环境设置为:堆栈可执行、地址随机化关闭shell
选择anything+retaddr+nops+shellcode
的结构构造攻击buf,先猜想返回地址所在位置,而且找到shellcode
所在地址服务器
在终端注入这段攻击buf:函数
先不输入“回车”,在后面的调试过程当中须要继续运行的时候再回车,此时再打开另一个终端,用gdb来调试20145215pwn1
这个进程,先找到该进程的进程ID,再打开gdb,用attach
指令对该进程进行调试:ui
对foo
函数进行反汇编:3d
在ret
处设置断点,接着继续运行到断点处,显示当前esp的值并依照此位置显示接下来的内存地址内容,来分析咱们以前猜想的返回地址位置是否正确以及shellcode
的地址,然而我一开始一直没有找到,如同见鬼,再修改无数次后在勉强找到调试
shellcode
代码,由此咱们能够推断出shellcode
地址为:0xffffd3d4
继续运行,如红色方块中所示,能够确认返回地址是被咱们以前输入的\x01\x02\x03\x04
所覆盖的:code
将返回地址修改成0xffffd3d4
,从新注入,苍天啊,终于成功了blog
进入32位linux环境,将地址随机化关闭,而且把/bin/sh
指向zsh
:进程
将漏洞程序保存在/tmp
目录下:
编译该代码,使用–fno-stack-protector
来关闭阻止缓冲区溢出的栈保护机制,并设置给该程序的全部者以suid权限,能够像root用户同样操做:
读取环境变量的程序:
/tmp
目录下: getenvaddr
程序得到BIN_SH
地址,利用gdb得到system
和exit
地址:
将上述所找到的三个内存地址填写在20145211exploit.c
中:
删除刚才调试编译的20145211exploit
程序和badfile
文件,从新编译修改后的20145215exploit.c,gcc -m32 -o 20145211exploit 20145211exploit.c
先运行攻击程序20145211exploit
,再运行漏洞程序20145211retlib
,攻击成功,得到了root权限,ls一波: