0ctf2017-pages-choices
Pages
题目来自于CCS 2016 《Prefetch Side-Channel Attacks: Bypassing SMAP and Kernel ASLR》,利用intel prefetch指令来区分mmaped memory和empty memory。
Choices
想找时间再分析分析这个题目然后再把writeup给写了,但是感觉最近没空,就先把这个发了。
这是一个被控制流混淆的逆向题目,还好原来的程序不是很复杂,混淆后也将就能看。程序提供了被混淆的程序本身,也提供了混淆这个程序的Clang插件,并告诉Clang的版本是3.9.1。自己并没有分析清楚这个控制流是怎么混淆的,只是通过一些其他手段分析出flag。
程序的基本功能是用户不断的输入数字,直到用户输入-1173196446的时候程序开始计算一段内存的sha256的数值,如果和指定的值匹配,则这段内存就是flag并输出。程序会根据用户的输入数字进行具体的操作,操作有三种:第一种是根据index取指定地址的数据,每次取4字节(这段数据在程序的.rodata节,长度为56字节,index初始值为0);第二种是对取出的数据进行运算;第三种是将运算后的数据放到指定缓冲区(就是flag缓冲区),并增加index为下一次取数据做准备。到最后则计算缓冲区的sha256并验证。
如果用户输入的数字没有落到这三种当中,则一直输入下去。根据对三种操作的分析,则第一种和第三种是配对的,中间可以插入任意多个第二种操作。而且,为了能通过验证,则用户输入的数字序列应该是唯一的。
自己尝试使用提供的命令行来编译自己写的程序来观察这个插件的工作,不幸的是并没有编译成功。因为这个插件的两个导入函数在其他模块,而其他模块并没有被提供。分别是toObfuscate(bool, llvm::Function*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)和fixStack。
将提供的Clang插件拉入IDA,可以定位到关键函数就是Oops::OopsFlattening::runOnFunction,大致的分析后发现程序在用户的程序中插入scanf调用,而且在进行分支处理的时候会调用Oops::CryptoUtils::scramble32(Oops::CryptoUtils *this, unsigned int id, const char *data)获取一个32位的数值,id则是从0开始增加代表分支的label id。结合程序里的各种数字,我推断将id从0开始递增不断调用Oops::CryptoUtils::scramble32的返回值序列将是正确的输入序列,验证之后确实如此。在分析了Oops::CryptoUtils::scramble32之后,发现函数的返回值与data字符串内容有关。
将程序的缺少的两个导入函数的调用给nop掉,然后就可以用gdb调试clang的编译过程了,在Oops::OopsFlattening::runOnFunction上下断点,跟下去就能获得data的数值,接下来用idaemu模拟执行Oops::CryptoUtils::scramble32获取正确的输入序列。核心的代码:
def getrandom(emu):
randoms = []
buf = '\x4b\x45\x10\x20\x8d\xc5\xf9\xb6\x61\xd6\xcf\x32\x12\x44\xd1\x3e'
rrdx = 0xc0000000
emu.setData(rrdx, buf)
for i in range(100):
rax = emu.eFunc(0x27934, args=[0, i, rrdx])
randoms.append(rax)
#end
if rax == 0xba127162:
break
return randoms
def getinput(rands):
input = ''
for i in rands:
if i < 0x80000000:
input += str(i).strip('L')
input += ' '
else:
input += '-'
input += str(0x100000000-i).strip('L')
input += ' '
input += 'done'
return input
emu = Emu(UC_ARCH_X86,UC_MODE_64)
rands = getrandom(emu)
input = getinput(rands)
#print(rands)
print(input)
del emu
input就是-31433233 -285567292 2037610950 -2095442962 1882077595 899592143 -1232084351 -1035247152 -673337996 362736264 -1818931825 1163875799 1309929227 -1304292073 -555122902 -924598566 -1618250207 1890769795 -972048612 302076013 49850286 1301200376 1815301527 -1465217760 -41945993 -1114108749 971973067 -526488978 -1190177184 1886727646 -1139056370 -502439399 510890680 301250227 -1966906358 -468320086 -1117675870 -278521534 842536262 80078663 -1403901587 1264512961 -135592801 1089631664 2125370169 -2083050856 803195994 68351607 -382958238 1144688074 -194893474 -1391846984 -928154047 -292497767 2102294064 -164926706 883886221 -594992301 755772664 -807924817 -77124306 1847175114 -1173196446 done。Flag就是flag{wHy_d1D_you_Gen3R47e_cas3_c0nst_v4lUE_in_7h15_way?}
0ctf2017-pages-choices的更多相关文章
- How to publish a WordPress blog to a static GitLab Pages site
https://opensource.com/article/18/8/publish-wordpress-static-gitlab-pages-site A long time ago, I se ...
- 用Github pages搭建自己制作的网页,方法最简单,适用于新手
本文固定链接http://blog.csdn.net/pspgbhu/article/details/51205264 本人自学前端一个多月,写个几个网页想要用来应聘,网上搜各种搭建网站的方法,发现不 ...
- Github pages + jekyll 博客快速搭建
Github pages + jekyll 博客快速搭建 寻找喜欢的模版 https://github.com/jekyll/jekyll/wiki/sites http://jekyllthemes ...
- Github Pages和Hexo创建静态博客网站
Github Pages和Hexo创建静态博客网站 安装Node.js 本人是window环境,所以下载window版. 下载地址:https://nodejs.org/en/download/ 下载 ...
- 如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites]
如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites] 一.布局页面介绍[Abo ...
- 利用github pages创建简单的网站
github.com 作为最流行的源代码管理工具已经风靡全球,同时在依托于github也衍生出了各种各样的应用,比如可以利用github搭建博客系统等等. 先换个话题,我们每人手头都或多或少有些&qu ...
- 使用ASP.NET Web API Help Pages 创建在线接口文档
操作步骤 1.新建Web API项目 2.在项目Areas文件夹下找到以下文件,取消注释图中代码. 3.右键解决方案,属性,如图设置. 4.运行程序,点击右上角API 接口列表: 详情-无参数: 详情 ...
- 用GitHub Pages搭了个静态博客
经过周末两天折腾,终于在GitHub Pages上用Hugo搭了个静态博客. 链接:https://xusiwei.github.io/ @ruanyf 曾经在博客里提到过"喜欢写Blog的 ...
- 【一】Ubuntu14.04+Jekyll+Github Pages搭建静态博客
本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...
- 回发或回调参数无效。在配置中使用 pages enableEventValidation=true 或在页面中使用 %@ Page EnableEventValidation=true % 启用了事件验证
WebForm中回发或回调参数无效问题的解决 解决 .NET中回发或回调参数无效问题的解 该错误的详细提示信息为: 回发或回调参数无效.在配置中使用 <pages enableEventVali ...
随机推荐
- jsp->jar
(2)新建 WEB-INF目录 (3)在 WEB-INF/web.xml 中输入如下内容 <web-app xmlns="http://java.sun.com/xml/ns/j2ee ...
- python看内存
打断点,跑起来 ps -ef | grep python 找到PID(两个数的第一列) cat /proc/PID/status 内存主要看四个字段: vmpeak 虚拟内存历史峰值 vmsize ...
- Number Sequence---hdu1711(kmp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 题意就是求b数组在a数组出现的位置:就是kmp模板: #include<stdio.h&g ...
- 系列:每日一linux命令(转)
原文:http://www.cnblogs.com/peida/archive/2012/12/05/2803591.html 一. 文件目录操作命令: 1.每天一个linux命令(1):ls命令 2 ...
- oracle中 rownum 与 connect by的结合使用
原文:http://blog.sina.com.cn/s/blog_a26966d90102wwkb.html oracle中 rownum 与 connect by的结合使用 SELECT ROWN ...
- 一种部署 Python 代码的新方法
在Nylas,我们喜欢使用Python进行开发.它的语法简单并富有表现力,拥有大量可用的开源模块和框架,而且这个社区既受欢迎又有多样性.我们的后台是纯用 Python 写的,团队也经常在 PyCon ...
- .........请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping。
今天研究membership的时候出现的问题.在此记录一下. 解决办法就是,将"C:\Program Files (x86)\Microsoft Web Tools\Packages\Asp ...
- Storm程序永久代内存溢出
在集群中部署Storm应用程序的时候报错,并通过jdk自带的jconsole监控发现,永久代内存瞬间爆炸了 org.springframework.beans.factory.BeanCreation ...
- EXPORT_SYMBOL使用
EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static 函数和变量都会自动导入到kernel 空间的, 都不用EXPORT_SYMBOL() 做标记的.2.6就必须用EXPO ...
- linxu系统压缩解压命令
使用cat命令进行文件的纵向合并 两种文件的纵向合并方法 归档文件和归档技术 归档的目的 什么是归档 tar命令的功能 tar命令的常用选项 使用tar命令创建.查看及抽取归档文件 使用tar命令创建 ...