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 ...
随机推荐
- PL/SQL Developer使用技巧、快捷键(转载)
1.类SQL PLUS窗口:File->New->Command Window,这个类似于oracle的客户端工具sql plus,但比它好用多了. 2.设置关键字自动大写:Tools-& ...
- CentOS中制作本地yum源
1.光盘指向镜像 2.将镜像挂载到某个目录 mkdir /mnt/cdrom mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom 3.修改本机上的YUM源配置文件 ...
- 用flask开发个人博客(4)—— flask中4种全局变量
https://blog.csdn.net/hyman_c/article/details/53512109 一 current_app current_app代表当前的flask程序实例,使用时需 ...
- HDFS基本工作机制
- qemu进程页表和EPT的同步问题
背景分析: 在之前分析EPT violation的时候,没有太注意qemu进程页表和EPT的关系,从虚拟机运行过程分析,虚拟机访存使用自身页表和EPT完成地址转换,没有用到qemu进程页表,所以也就想 ...
- python web 程序的9种部署方式
python有很多web 开发框架,代码写完了,部署上线是个大事,通常来说,web应用一般是三层结构 Web Server====> Application=====> DB S ...
- java爬取网页内容 简单例子(1)——使用正则表达式
[本文介绍] 爬取别人网页上的内容,听上似乎很有趣的样子,只要几步,就可以获取到力所不能及的东西,例如呢?例如天气预报,总不能自己拿着仪器去测吧!当然,要获取天气预报还是用webService好.这里 ...
- C++入门(1)
#include<>直接从编译器自带的函数库中寻找文件 #include""是先从自定义的文件中找 ,如果找不到在从函数库中寻找文件 采用"< > ...
- 008-Hadoop Hive sql语法详解3-DML 操作:元数据存储
一.概述 hive不支持用insert语句一条一条的进行插入操作,也不支持update操作.数据是以load的方式加载到建立好的表中.数据一旦导入就不可以修改. DML包括:INSERT插入.UPDA ...
- 3D游戏引擎中常见的三维场景管理方法
对于一个有很多物体的3D场景来说,渲染这个场景最简单的方式就是用一个List将这些物体进行存储,并送入GPU进行渲染.当然,这种做法在效率上来说是相当低下的,因为真正需要渲染的物体应该是视椎体内的物体 ...