感觉自己逆向还没有入门。。。。。。还需要多做题
利用PE查壳得他是一个64位的文件,用相应的ida打开找的mian的函数
我们会输入六个数组来得到flag
先看sub_400770这个函数
这里的a1[0]和a1[5]是不是ida翻译错了,然后查看汇编将他们对应的16进制转化了一下,发现是真的错了,还是要多看看汇编。
算是一个比较简单的检验函数,经过计算得的个a1[]的值为:3746099070, 550153460, 3774025685, 1548802262, 2652626477, 2230518816(其实我是手算的,还不会写Python,丢人,赶紧去学Python)参考别人用Python的z3计算出了数组
from z3 import *
a2,a3,a4 = BitVecs('a2 a3 a4',64)
s = Solver()
s.add(a2 - a3 == 2225223423)
s.add(a3 + a4 == 4201428739)
s.add(a2 - a4 == 1121399208)
if s.check() == sat:
m = s.model()
for i in m:
print("%s = %ld" % (i, m[i].as_long()))
接下来就是加密函数
总的来说就是对我们输入的六个数组逐一进行加密,加密函数在sub_400686
加密情况就一目了然了。进行反向解密(其实就是反过来),脚本如下:
#include <stdio.h>
int main()
{
unsigned int a[6]={3746099070, 550153460, 3774025685, 1548802262, 2652626477, 2230518816};
unsigned int a2[4] = { 2,2,3,4 };
unsigned int v3, v4;
int v5;
int j,i;
for (j = 0; j <= 4; j += 2) {
v3 = a[j];
v4 = a[j + 1];
v5 = 1166789954*64;
for (i = 0; i <= 0x3F; ++i) {
v4 -= (v3 + v5 + 20) ^ ((v3 << 6) + a2[2]) ^ ((v3 >> 9) + a2[3]) ^ 0x10;
v3 -= (v4 + v5 + 11) ^ ((v4 << 6) + *a2) ^ ((v4 >> 9) + a2[1]) ^ 0x20;
v5 -= 1166789954;
}
a[j] = v3;
a[j + 1] = v4;
}
for (i = 0; i < 6; ++i)
printf("%x", a[i]);
}
输出16进制,后转换得
文章评论