写了逆向方向两个题5mc,df5
5mc
拖进ida,32位,后面有一段比较冗长但又难以理解的代码,实际作用是在初始化后续的加密段
1 | sub_7FF67C8E1020("flag:", argv, envp); |
这里是加密主要逻辑,对明文的加密段存储在lpAddress中,并且不是一成不变的,这里利用了SSE来进行对加密段的异或,看似复杂,实际上只是实现了同一段代码,经过不同种的异或最终做到不同的加密方式
还好是一个可以动调的程序,所以只需关注下面的(v30)(Buf1, &box);
16种加密,每四个一轮,每轮中前两种加密相同,后两种都比较相似,耐心即可
1 |
|
df5
这道题难在解密实现
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
可以看到,也是四种加密方式,不同的是加密逻辑是根据输入的每一位&3,形成的结果进行加密,32轮,如此一来解密时就需要知道上一轮经过什么加密,我先对当前轮对应的明文元素称之为,加密种数,我的想法是,先将密文四种都尝试解密,解密后的加密种数&3,查看是否结果与它所经过的加密一致
但同时有新的问题,如果它的解密结果刚好一致呢?所以要采取回溯法,就像走迷宫一样,这条路走不通,就回退换路,实现我选用递归
1 |
|