感觉有点意思. 主要就是考对文件内容的提取, 还有就是找规律。。
下载下来803个exe文件. 随便打开一个看见简单的输入对比, 再打开一个还是同样的.但没有发现与解题相关的东西.
也是后面想着再去看看这个题才发现 每个exe文件让我们输入的都是一个PE文件的一部分, 那 熟悉的 MZ(4D5A).
接下来就是取文件内容了. 但是每个程序都是加了upx壳的。
然后用C语言写脱壳:
下面提取每个程序的 PE文件那部分的内容. 弄完, 保存为exe文件后, 打不开...ida也不行, 看看了PE文件内容发现区段都没有。。
那就提取的内容有问题, 多看了几个原来的exe文件, 果然, 有的提取内容的位置不一样. 但有803个exe。
开始找规律. 列举了很多还是没发现. 这也是本题花费时间最多的地方........最后发现, 根据exe文件的字节大小来区分...改了一下提取内容的程序.
仍然打不开, 但是这次区段都是齐的, ida可以打开就好了.
载入ida, 发现有很多干扰项, 但可以在比较函数上面一个看出是 base64加密. 最后与密文比较.
找密文. 可以发现是程序运行才赋值的.找到赋值的地方提取出来.
提取出来base解密一下, 再md5得到flag. e801bcbcc42d3120d910ccc46ae640dd
64位elf文件, 载入ida后发现与以往的不同. 很多函数都没显示出来.
linux中运行一下, 显示对flag加密, 然后是一些乱码. 后来群里通知, 这个有靶机.
nc连接一下, 那题目的flag存放在服务器, 文件操作取出flag, 经过加密.
接着再在ida中看一下, 有几个字符很懵, 后面才发现就是改变输出字符串样式, 这也是为什么linux中运行的时候会有涂鸦与闪动,
然后是被涂鸦的那一段坑了, 显示 Flag was encrypted by http://cc.TaQini.space , 一直以为加密和这个有关, 嗯...
虽然很多函数不能显示出来, 但也是能猜出来作用. 看看汇编会更清楚.
最后找到加密函数 sub_1249((__int64)byte_4080);, 这下就好办了. 进去函数可以知道, 大写字母加密为大写字母, 小写字母加密为小写字母, 其他字符不变.
对于逆这个算法, 没有过多的想, 算是直接穷尽的吧(算法太菜). 因为大写字母变大写字母,小写字母变小写字母.
exp:
最后补充一下题中对改变输出字符串的代码.
| \033[05m | 闪烁 |
| \033[40m -- \033[47m | 设置背景色 |
下载下来, 64位的无壳elf文件和一个操作码文件. 操作码其实题中也有, 这里单独给了方便很多.
载入ida. C++逆向类的, 但还好都是很基本的语法. )
分别进去三个加密函数. 第一个: sub_19E2((int64)&v13**, (__int64)&v14);很简单, 就是 2个数的值交换.
第二个: sub_1551((int64)&v14, (int64)&v13);, 就是按照给定顺序进行简单的值交换.
第三个: v8 = (unsigned int)sub_EEC(&v14, &v15, 0LL) != 0, 这个相对于要麻烦一些, 但分析一下, 思路理清, 逆回去就好了.
exp: C语言写的, 比较冗长.
第一个文件太大, 上传不了
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i = 0;
char a[100] = {0};
for(i = 0; i < 804; i++)
{
sprintf(a, "upx -d %d.exe", i);
system(a);
}
return 0;
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2020-9-10 18:45
被BIX编辑
,原因: 文章修改了下, 内容直接掉了, 重新补的.