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的更多相关文章

  1. 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 ...

  2. 用Github pages搭建自己制作的网页,方法最简单,适用于新手

    本文固定链接http://blog.csdn.net/pspgbhu/article/details/51205264 本人自学前端一个多月,写个几个网页想要用来应聘,网上搜各种搭建网站的方法,发现不 ...

  3. Github pages + jekyll 博客快速搭建

    Github pages + jekyll 博客快速搭建 寻找喜欢的模版 https://github.com/jekyll/jekyll/wiki/sites http://jekyllthemes ...

  4. Github Pages和Hexo创建静态博客网站

    Github Pages和Hexo创建静态博客网站 安装Node.js 本人是window环境,所以下载window版. 下载地址:https://nodejs.org/en/download/ 下载 ...

  5. 如何在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 ...

  6. 利用github pages创建简单的网站

    github.com 作为最流行的源代码管理工具已经风靡全球,同时在依托于github也衍生出了各种各样的应用,比如可以利用github搭建博客系统等等. 先换个话题,我们每人手头都或多或少有些&qu ...

  7. 使用ASP.NET Web API Help Pages 创建在线接口文档

    操作步骤 1.新建Web API项目 2.在项目Areas文件夹下找到以下文件,取消注释图中代码. 3.右键解决方案,属性,如图设置. 4.运行程序,点击右上角API 接口列表: 详情-无参数: 详情 ...

  8. 用GitHub Pages搭了个静态博客

    经过周末两天折腾,终于在GitHub Pages上用Hugo搭了个静态博客. 链接:https://xusiwei.github.io/ @ruanyf 曾经在博客里提到过"喜欢写Blog的 ...

  9. 【一】Ubuntu14.04+Jekyll+Github Pages搭建静态博客

    本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...

  10. 回发或回调参数无效。在配置中使用 pages enableEventValidation=true 或在页面中使用 %@ Page EnableEventValidation=true % 启用了事件验证

    WebForm中回发或回调参数无效问题的解决 解决 .NET中回发或回调参数无效问题的解 该错误的详细提示信息为: 回发或回调参数无效.在配置中使用 <pages enableEventVali ...

随机推荐

  1. angular的属性绑定

    1. 图片地址属性绑定 html文件 <img [src]="imgUrl"> ts文件 export class ProductComponent implement ...

  2. Sonnet-十四行诗

    <Wish> Of our best wishes we could desire increase, That thereby rose's aroma might never die, ...

  3. Python--进阶处理6

    # =================第六章:数据编码和处理====================== # 读CSV文件# 数据读取为一个元组的序列import csv# with open('E: ...

  4. Socket连接何时需要断开

    socket连接没有正常断开,导致无法下次无法进行连接.

  5. No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-netflix-ribbon?

    ... 60 common frames omittedCaused by: java.lang.IllegalStateException: No Feign Client for loadBala ...

  6. ArcEngine之Provide your license server administrator with the following information.error code =-42

    今天打开VS,不一会就出现了下面的对话框,感到非常疑惑,仔细一想,原来是昨天不小心把权限弄错了! 解决办法:在控价中找到AxLicenseControl,右键属性,把权限改为ArcGIS Engine ...

  7. Gartner提出的7种多租户模型

    下面,我们就来看看在SaaS应用搭建过程中,可以采用什么样的多租户模型.从而能较为清晰地了解未来使用PaaS平台开发的SaaS,可以为用户提供哪些多租户的服务.        Gartner提出了7种 ...

  8. django允许外部访问

    默认方法启动django python manage.py runserver 这时启动的服务只能在本机访问,这是因为服务只向本机(127.0.0.1:8000)提供,所以局域网的其他机器不能访问. ...

  9. Python并行编程(八):with语法

    1.基本概念 当有两个相关的操作需要在一部分代码块前后分别执行的时候,可以使用with语法自动完成.同时,使用with语法可以在特定的地方分配和释放资源,因此,with语法也叫作"上下文管理 ...

  10. linux多服务器之间的目录文件同步

    一.rsync是什么 在开始正式学习rsync之前,我们先来回答这个问题:rsync是什么. rsync(remote synchronize)是Liunx/Unix下的一个远程数据同步工具.它可通过 ...