看雪CTF 2019Q3 第十题 传家之宝 WP
2019-09-26 13:41:38 Author: bbs.pediy.com(查看原文) 阅读量:163 收藏

[原创]看雪CTF 2019Q3 第十题 传家之宝 WP

11小时前 67

[原创]看雪CTF 2019Q3 第十题 传家之宝 WP

运行之后输入key然后就是程序长时间的卡死,然后过了很久才告诉我结果。

本来第一反应是里面用了高强度的虚拟机,结果进去每一步都挺清楚的,没有加密或者混淆的地方。唯二需要注意的地方就是代码的空间量很大,而且基本都是rwx权限。

然后跟踪没多久就jmp eax跳转了,然后。。。除了没有输入,基本就是一个循环。。

整个流程不调用api,数据/代码在空间内来回跳,实在不好下断点。

基本猜测作者是写了一个自解密函数,然后又写了个加密变形函数把这个函数来回加密变形,最后造了个pe结构套上去。

只好注入一个dll接管exe的执行流程,把每一步的call eax就hook下来,接管跑完之后发现居然有2880次解密操作。

然后再分析数据的变化过程,本来以为只有最后一层的代码有用,结果,跑完之后发现所谓的核心代码居然不完整。

回头发现原来每一层里其实都有或多或少的几句汇编代码,虽然不一定有完整功能,但是可以和其他层的连上。

那就修改dll开始抠代码,中间加载了od的反汇编库来计算指令长度,然后去掉中间的各种跳转指令,最后把完整的函数的二进制字节码保存成了文件,居然达到了37k之大。

本来以为这个题目最难的地方已经过去了,没想到对于不懂密码的我来说,噩梦刚刚开始。

ida打开这个文件就卡死了,反编译成解密函数更是用了半小时,好在用vs编译起来就快多了,而且运行结果也完全正确。

但是刚看了函数的前5行就看不懂了,看了前10行就蒙了,看了前20行直接就想摔键盘了。

*(p_ebp - 1) = p_esi[439] ^ p_esi[423];

*(p_ebp - 2) = p_esi[442] ^ p_esi[426];

v2 = p_esi[421] ^ p_esi[437];

v3 = p_esi[441] ^ p_esi[425];

v4 = (unsigned__int8)p_esi[433];

*(p_ebp - 3) = p_esi[404] ^ p_esi[(unsigned__int8)p_esi[420] ^ (unsigned__int8)p_esi[436] ^ 9];

v5 = p_esi[405] ^ p_esi[(unsigned__int8)p_esi[417] ^ v4 ^ 9];

v6 = (unsigned__int8)p_esi[430];

*(p_ebp - 4) = v5;

v7 = p_esi[406] ^ p_esi[(unsigned__int8)p_esi[446] ^ v6 ^ 9];

v8 = (unsigned__int8)p_esi[427];

*(p_ebp - 5) = v7;

v9 = p_esi[407] ^ p_esi[(unsigned__int8)p_esi[443] ^ v8 ^ 9];

v10 = (unsigned__int8)p_esi[424];

*(p_ebp - 6) = v9;

v11 = p_esi[408] ^ p_esi[(unsigned__int8)p_esi[440] ^ v10 ^ 9];

v12 = (unsigned__int8)p_esi[434];

*(p_ebp - 7) = v11;

v13 = v2 ^ 9;

v14 = *((_DWORD *)p_esi + 107);

*(p_ebp - 8) = p_esi[409] ^ p_esi[v13];

LOBYTE(v13) = p_esi[410] ^ p_esi[(unsigned__int8)p_esi[418] ^ v12 ^ 9];

这是谁?这在哪?这在干什么?

我只能往我已知的几种密码算法上靠。下载了几种常见的密码算法比对了一下,发现和aes的结构最像,都有个类似的置换表,虽然内容和结果都对不上,代码形式上面更是差了10万八千里,只有输出结果在输入相同的字符时表现出奇怪的4字节循环。(此处花费1天半)

只能死马当成活马医了。我觉得我下面的举动成为了能做出这道题的关键,那就是删。看不顺眼的,对不上的,全删了。置换表、密码表全清了,代码里莫名其名会跑出非0的地方变化,也都删的干干净净,总之最后的结果,就是让这4字节循环相同。(此处花费1天)

在让aes和目标代码跑出相同结果之后,我才真正感受到了希望,然后就是各种添加。首先添加相同的置换表,输出相同,然后设置秘钥长度,设置加密轮次相同,最后添加秘钥的时候失败了很久,只要密钥清空就是对的,一加上密钥就是错误。后面才发现虽然aes虽然是对称密码,但是加解密函数操作是不同的,于是我测试了解密函数,这才和目标函数对应上。最后一步就是添加上目标函数里那些奇怪的异或和加减法,成功的实现了一个自定义的aes函数。

然后把KCFT的二进制用这个自定义的aes解密,就得到了KEY。

[培训]《安卓高级研修班》彻底搞定函数抽取型壳!现在报名得源码和安卓8.1脱壳机!10月20日深圳专场不见不散!

最后于 11小时前 被xym编辑 ,原因:


文章来源: https://bbs.pediy.com/thread-254722.htm
如有侵权请联系:admin#unsafe.sh