admin 管理员组文章数量: 1086061
【reversing.kr逆向之旅】Ransomware的writeup
Exeinfope查到有UPX壳
先使用脱壳机进行脱壳
脱壳后载入IDA 发现直接显示太大无法展示
空格转为文本视图 可以很明显知道 下面红框中的就是一段段花指令
查看最后结束的位置 就在0x0044A775
直接IDC脚本将他们都NOP掉
auto i,start = 0x004135E9,end = 0x0044A775;
for(i=start;i<end;i++){
PatchByte(i,0x90);}
Message("\n" + "OK\n");
接着可以发现函数sub_401000也有一段花指令
依然是找到起始和末尾地址 IDC脚本nop掉
nop之后可以发现它就是一个空函数
auto i,start = 0x00401006,end = 0x004135CE;
for(i=start;i<end;i++){
PatchByte(i,0x90);}
Message("\n" + "OK\n");
之后改下main()的起始地址 改到nop指令结束的位置 再改下使堆栈平衡就可以F5了
F5的时候报错
提示哪里有问题 就修改它上边的数值 直到他们都是整数 就可以F5了
可以参考
既然堆栈已经平衡 那我们F5看下伪代码
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{unsigned int len_key; // kr00_4FILE *v4; // ST2C_4FILE *v6; // [esp+1Ch] [ebp-14h]unsigned int file_len; // [esp+20h] [ebp-10h]int v8; // [esp+28h] [ebp-8h]unsigned int i; // [esp+28h] [ebp-8h]unsigned int j; // [esp+28h] [ebp-8h]FILE *file; // [esp+2Ch] [ebp-4h]printf("Key : ");sub_401000();scanf("%s", key);len_key = strlen(key);sub_401000();v4 = fopen("file", "rb");sub_401000();if ( !v4 ){sub_401000();printf("\n\n\n颇老阑 茫阑荐 绝促!\n");sub_401000();exit(0);}fseek(0, 0, 2);sub_401000();file_len = ftell(file); // 函数 ftell() 用于得到文件位置指针当前位置相对于文件首的偏移字节数sub_401000();rewind(file); // 是检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0sub_401000();while ( !feof(file) ){sub_401000();file_data[v8] = fgetc(file); // 从文件指针stream指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节sub_401000();++v8;sub_401000();}sub_401000();for ( i = 0; i < file_len; ++i ) // 这里是关键{file_data[i] ^= key[i % len_key]; // 先将file的每个字节与key的每个字节异或sub_401000();file_data[i] = ~file_data[i]; // ~表示按位取反 将得到的数组再做取反操作sub_401000();}fclose(file);sub_401000();v6 = fopen("file", "wb");sub_401000();sub_401000();for ( j = 0; j < file_len; ++j ){fputc(file_data[j], v6);sub_401000();}printf("\n""颇老阑 汗备沁促!\n""唱绰 各矫 唱悔瘤父 距加篮 瘤虐绰 荤唱捞促!\n""蝶扼辑 呈啊 唱俊霸 捣阑 玲绊, 棵官弗 虐蔼阑 罐疽促搁 颇老篮 沥惑拳 登绢 乐阑 巴捞促!\n""窍瘤父 父距 肋给等 虐甫 持菌促搁 唱绰 酒林酒林 唱悔扁 锭巩俊 呈狼 颇老篮 肚 噶啊龙 巴捞促!");sub_401000();return getch();
}
可以看到 多处调用了sub_401000这个空函数 那我们分析时直接忽略就好(怪不得加载那么卡)
分析过程已经写在里边了
既然我们已经知道提供的file是一个加密后的.exe文件 那我们可以先找到加密所用的Key
通过和一个正常的exe文件进行对比 可以发现PE结构中的不同
key值可以用python脚本来得到
#加密后的
cipher_data = [0xC7, 0xF2, 0xE2, 0xFF, 0xAF, 0xE3, 0xEC, 0xE9, 0xFB, 0xE5, 0xFB, 0xE1,0xAC, 0xF0, 0xFB, 0xE5, 0xE2, 0xE0, 0xE7, 0xBE, 0xE4, 0xF9, 0xB7, 0xE8,0xF9, 0xE2, 0xB3, 0xF3, 0xE5, 0xAC, 0xCB, 0xDC, 0xCD, 0xA6, 0xF1, 0xF8,0xFE, 0xE9
]
#原始的
plain_data = [0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D,0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72,0x75, 0x6E, 0x20, 0x69, 0x6E, 0x20, 0x44, 0x4F, 0x53, 0x20, 0x6D, 0x6F,0x64, 0x65
]key = ''
#与0xff异或可以用来取反
for i in xrange(len(cipher_data)):key += chr(cipher_data[i] ^ 0xFF ^ plain_data[i])print key
#letsplaychessletsplaychessletsplayches
因为数据比较多 所以多个key连在一起
可以很明显知道Key就是letsplaychess
那么我们既然已经拿到了key值 就可以解密啦
#加密后的
enc_data = open('file', 'rb').read()
#原始的
origin = open('origin.exe', 'wb')
#我们的key
key = 'letsplaychess'for i in xrange(len(enc_data)):origin.write(chr((ord(enc_data[i]) ^ 0xFF) ^ ord(key[i % len(key)])))origin.close()
解密后得到origin.exe
运行即可(win10可能会提示缺少.dll文件 下载好放在同级目录即可)
参考链接:
.html
本文标签: reversingkr逆向之旅Ransomware的writeup
版权声明:本文标题:【reversing.kr逆向之旅】Ransomware的writeup 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1688024928a170154.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论