1 ROP
这两道题的核心思想是ROP,ROP(返回导向编程),通俗的说,就是溢出后使用返回函数跳转到目标。一般来说,ROP应用在不能直接shellcode的情况下(NX开启时shellcode不能写入内存),具体了解ROP见wiki。
2 pwn1分析
检查程序:开启NX保护,不能写shellcode;32位linux
看代码:发现一个scanf,输入写在内存,考虑通过scanf控制;发现system函数,可以利用;
编写ROP链:scanf有两个参数和一个返回值,因此ROP结构为【scanf地址】+【return】+【参数】+【参数】,return应该是system,system有一个参数和一个返回值,system结构为【system地址】+【return】+【参数】,我们可以用scanf写入一个“/bin/sh",然后返回system函数,system的参数为”/bin/sh“
tips:scanf有两个参数,我们本应pop pop ret,但如果我们把return直接写成system,我们”惊喜的“发现这上面其实就完美的对应了return+参数。。。
因此,rop结构为:【scanf地址】+【system地址】+【%s地址】+【参数】
搞定!接下来我们看一个特殊的
3 Xman level3 题目描述
libc!libc!这次没有system,你能帮菜鸡解决这个难题么?
附件:https://adworld.xctf.org.cn/media/task/attachments/c42e36c561b844fe91c0d086fbecbf50.gz
4 分析
老规矩,NX保护,32位linux
IDA看代码,找到write和read两个可以溢出的位置
但是,IDA看代码发现这次没有system了。。。。
附件给了一个libc,google搜索,发现libc是linux下C函数库,这里面是从libc中调用system
这就涉及到基地址和真实地址了,感兴趣的网上查吧:总之,真实地址=基地址+偏移地址(偏移地址已知)
通过write函数溢出找到write的真实地址,真实地址-偏移地址=libc基地址,由于各函数偏移地址已知
因此可以求出system的真实地址,后面的过程就和以前一样了。
5 知识点整理
这两道题涉及到了很多知识点,不了解这些知识点可能会很懵逼
核心知识点:
checksec使用
pwntools使用
ROP绕过技术
libc
拓展知识点:
gdb.attach调试
pwn常见的各项保护机制
shellcode
pop|ret是什么意思?
至此,本玩家半只脚踏进了pwn的大门(离入门还有很长的路)。
来源:CSDN
作者:dynMagicGoat
链接:https://blog.csdn.net/weixin_44031198/article/details/103221494