小涂的电脑不幸中了文件加密勒索病毒,他的一个重要文件被加密了,加密后的文件为 flag.png.xiran。小涂经过排查,在他的电脑中找到了文件加密勒索病毒样本,文件名为 clickme。小涂通过攻击者留下了联系方式联系了攻击者,攻击者表示他不会勒索个人用户,但是他也没有义务帮小涂恢复文件,于是把某一秘密信息做成了挑战发给了小涂,文件名为 cha。攻击者表示,如果你想要恢复你的文件,你必须通过挑战拿到秘密信息,并且合理利用这个秘密信息。如果小涂不能通过挑战,那就只能爆点金币了。
注意:题目中提供的恶意软件样本(clikeme)请勿在生产环境运行,建议使用虚拟机环境中运行,运行前建议保存虚拟机快照,用于保护虚拟机环境,此样本不会收集用户信息,cha 文件无恶意功能,仅有文件加密功能,加密当前目录以及子目录。
附件在这个帖子里有 https://www.52pojie.cn/thread-1962548-1-1.html
工具
ida8.3
思路
简单来说,这道题就是一个加密文件的勒索病毒 clickme 和一个普通ctf题 cha 结合的东西。所以可以分开来看。
在cha 里,仔细找找之后可以发现关键部分是(对函数进行了一些重命名)

2024-09-08_15-16-10.png (20.33 KB, 下载次数: 0)
下载附件
2024-9-25 22:23 上传

2024-09-08_15-16-18.png (21.61 KB, 下载次数: 0)
下载附件
2024-9-25 22:23 上传
整个流程就是,先进行hash,确认hash值后进行处理和判断操作,处理前先进行base变换,base表可以在程序中找到,是

2024-09-08_15-16-39.png (5.71 KB, 下载次数: 0)
下载附件
2024-9-25 22:23 上传
然后把 base 得到的结果和原本数组中模意义下的值进行异或,再与存在程序中的值进行比较。
于是可以写脚本分每3个一组爆破,但由于异或时每一组的base结果会和后面的原本的值进行异或,所以爆破时每一组会影响到后面的值,进行一些判断就可以了。然后因为python效率很慢,用了c++来爆破,几秒就可以出来
然后来看病毒 clickme ,是个用go写的程序,没有去符号表,关键部分是

2024-09-08_13-32-15.png (2.94 KB, 下载次数: 0)
下载附件
2024-9-25 22:23 上传

2024-09-08_13-32-21.png (10.08 KB, 下载次数: 0)
下载附件
2024-9-25 22:23 上传

2024-09-08_13-32-49.png (21.51 KB, 下载次数: 0)
下载附件
2024-9-25 22:23 上传

2024-09-08_13-32-56.png (22.61 KB, 下载次数: 0)
下载附件
2024-9-25 22:23 上传

2024-09-08_13-33-14.png (51.98 KB, 下载次数: 0)
下载附件
2024-9-25 22:23 上传

2024-09-08_13-33-24.png (33.55 KB, 下载次数: 0)
下载附件
2024-9-25 22:23 上传
列一下用到的关键函数,curve25519,sha256,chacha20。curve25519是一种椭圆曲线加密函数,是个非对称加解密函数,sha256就是哈希函数,chacha20是个对称加解密函数。
理一下逻辑,这个程序干的事就是先rand生成32字节的数据,再用公钥进行加密,然后用sha256,sha两次,作为chacha20的初始化参数,然后进行加密。对于大文件,每0xA00000长度的数据,加密0x100000长度。最后在末尾添上被加密后的rand生成的32字节数据,还有6字节的硬编码。
因为从cha 里得到了32字节的数据,放在勒索病毒这里来用,意思就是那个32字节的数据是rand数据加密的私钥。然后写go解密就可以了

2024-09-08_15-33-19.png (344.16 KB, 下载次数: 0)
下载附件
2024-9-25 22:23 上传
代码
cha用到的求32字节数据的脚本(c++):
#include
#include
using namespace std;
char v7[]="APet8BQfu9CRgv+DShw/ETixFUjyGVkzHWl0IXm1JYn2KZo3Lap4Mbq5Ncr6Ods7";
int get_result[]={0xD9, 0x40, 0x6F, 0xCA, 0x3D, 0x8F, 0x53, 0xB1, 0x8B, 0x34, 0x92, 0x8E, 0xF7, 0x19, 0x94, 0x61, 0x68, 0x71, 0x55, 0xB6, 0xCE, 0x5B, 0x71, 0x1A, 0x79, 0x42, 0x9D, 0x02, 0x93, 0x38, 0xAD, 0x1F, 0xD3, 0x24, 0x48, 0xFF, 0x21, 0xA2, 0x24, 0xBE, 0x95, 0x3A, 0xC1, 0xD2, 0x00, 0x00, 0x00, 0x00, 0x00};
int result[48],re_l;
int ans[48],an_l;
void pb(int a){
result[re_l++]=a;
}
int b64_enc(int length){
re_l=0;
int ll=4*((length+2)/3);
for (int i = 0; i > 2]);
if (length > 4)]);
if (length > 6)]);
pb(v7[ans[i + 2] & 0x3F]);
}
}
}
return ll;
}
int real_l,trans_l,times_l;
int mn(int a,int b){
return a=32){
// printf("%x ",ans[i%32]^result);
if(i>=43){
puts("GET-----");
for(int j=0;j1){
for(int j=0;j2){
for(int k=0;k