# 主函数
1 | void __cdecl main_main() |
其中 runtime_newproc 函数代表启动了另一个线程来执行函数,交叉引用可以发现引用的是 main_checkflag 函数,后面的数组比如 & off_4E9BC0 就是提示语,在 linux 中打开之后输入 flag 会提示’Who am I? where am I? what am I doing?’,不过我们先不用管这个,先看关键函数
# main_checkflag
1 | __int64 __fastcall main_checkflag(int a1, __int64 a2, int a3, __int64 a4, int a5, int a6, __int64 a7, __int64 a8) |
这个函数出现了一个 main_Myencode,看名字就觉得是个关键函数,再看后面也有一个类似刚才的数组,然后我们点进去看,发现一个关键信息
说明 flag 是我们输入的字符串的 md5 值,现在看 main_Myencode 函数
# main_Myencode
1 | __int64 __fastcall main_Myencode(int a1, int a2, int a3, _DWORD a4, int a5, int a6, __int64 a7, __int64 a8, int a9) |
看到了两个 rc4 加密的函数,说明这里是将输入的字符串进行了 rc4 加密,并且可以看到 21 行这里看到有一个 main_enc_key,这应该就是密钥了,可以直接看到它的值 "thisiskkk",然后在这里突然又想起在外面那个函数也看到一个类似这个的东西,就是 main_enc,然后点进去看发现是个数组,这刚好和密钥的名字对应,肯定就是加密后的结果了
1 | 0xD8, 0xE5, 0x85, 0xBE, 0xE7, 0xF8, 0x58, 0x75, 0x95, 0x65, |
不过这不是最终的加密结果,一开始没有发现,最后这一串还异或了一个 0x23,在 ida 左侧的函数栏里面还有一个带有 main 的函数 main_init_0,在这个里面又将 rc4 后的结果进行了一次异或,所以虽然说名字像不一定是百分百有联系,但还是看一下比较好,官方的 wp 说还可以通过动调来直接找这个最终的密文,一开始也尝试了动调,但我是直接用 ida 的远程调试的,搞了很久没搞出来,可以用 gdb 调试,但 dlv 会更方便(不会 dlv)
# 总体思路
程序将输入的字符串进行一次 rc4 加密再进行一次异或,我们只要先异或再解密就行了,知道了 key 和密文,再 rc4 解密一下就行了,解密脚本用的是一位大佬写的,解密之后得到 56e83694-f976-11eb-b343-faffc201c8e0,在 linux 中运行程序的时候,输入这个字符串,也会弹出提示,最终的 flag 是 DASCTF {md5 (Input)},所以在程序的分析中没有发现这个也是没问题的
得到 flag:DASCTF{9e1963bbbb1285b993c862a5a6f12604}