(gdb) x/16x : 使用x命令(examine的简写)来查看内存地址中的值。
* x命令的语法:x/
* n表示单元个数,f表示显示的进制,u表示每一个单元的大小。
system :是一个函数,用于运行其它外部程序
git
先将环境设置为:堆栈可执行、地址随机化关闭
shell
以 anything+retaddr+nops+shellcode 的结构来构造,先估计返回地址所在位置,而且找到 shellcode 所在地址
sass
要验证返回地址所在位置以及找到 shellcode 地址,须要使用GDB调试
* 先运行 20145325pwn1 可执行文件
bash
(先不输入“回车”,在后面的调试过程当中须要继续运行的时候再回车,到时候就会显示如图的字符部分)服务器
* 再找到正在执行的 20145325pwn1 的进程号
* 进入GDB,联系上该进程号
* 在 ret 处设置断点,接着运行到断点处,显示当前esp的值并依照此位置显示接下来的内存地址内容,并由此分析出返回地址位置的正确性以及shellcode的地址
(红色方框为返回地址处,红色椭圆为 shellcode 代码,由此推算出 shellcode 地址为 “\x31\xd3\xff\xff”)网络
* 继续运行,再次检测是否跳到覆盖的返回地址所表示的地方
(如红框所示,已经能够确认返回地址是被 \x10\x20\x30\x40 所覆盖的)ide
将做为输入的 input_shellcode 处的 “\x10\x20\x30\x40” 换为上面所找到的 shellcode 地址 “\x31\xd3\xff\xff”
函数
执行 20145325pwn1 ,成功注入 shellcode
学习
进入linux32的环境,将地址随机化关闭,同时使用ln
命令,让 /bin/sh 指向另外一个shell程序(这里是zsh)(由于原 /bin/bash 有保护措施,即便能调用一个shell,也不能在这个shell中保持root权限)
编写retlib文件并进行编译(注意要使堆栈处于不可执行状态),同时将其设为 Set-UID 程序
编写攻击代码
使用编译好的 读取环境变量 程序,获得/bin/sh的地址
编译攻击程序,并经过调试该程序获得 system 与 exit 的地址
再将攻击程序中的buf换为刚刚得到的3个地址
从新编译攻击程序
先运行攻击程序,再运行SET-UID程序,观察是否成功得到root权限
成功
居然成功了
又成功了?