1、经典查壳:
64位无壳ELF软件
2、IDA启动:
找到main函数
经典的输入加密比较系列
3、加密函数:
还是从比较入手,然后这是一个TEA加密,进去看看
对于这种加密,我们只需要将其反过来就行,v5要取加密完之后的值作为解密的初值
4、比较函数:
瞅一眼比较函数的内容:
对于这个函数,我们使用z3将其求解出来:
代码:
from z3 import *
s=Solver()
a1= [Int(('%d' % i)) for i in range(6)]
s.add(a1[2]-a1[3]==2225223423)
s.add(a1[3]+a1[4]==4201428739)
s.add(a1[2]-a1[4]==1121399208)
s.add(a1[0]==-548868226)
s.add(a1[5]==-2064448480)
s.add(a1[1]==550153460)
s.check()
result=s.model()
print(result)
回头来看加密函数的解密:
外层一个for循环,内层一个for循环:
给一下解密代码:
5、解密代码:
#include <iostream>
using namespace std;
int main() {
int data[6] = { 3746099070,550153460,3774025685,1548802262,2652626477,2230518816 };
unsigned int tmp1, tmp2;
unsigned int v3, v4;
int key[4] = { 2,2,3,4 };
for (int i = 0; i < 5; i +=2) {
v3 = data[i];
v4 = data[i + 1];
int v5 = 1166789954 * 64;
for (int j = 0; j < 64; ++j)
{
v4 -= (v3 + v5 + 20) ^ ((v3 << 6) + key[2]) ^ ((v3 >> 9) + key[3]) ^ 0x10;
v3 -= (v4 + v5 + 11) ^ ((v4 << 6) + key[0]) ^ ((v4 >> 9) + key[1]) ^ 0x20;
v5 -= 1166789954;
}
data[i] = v3;
data[i + 1] = v4;
}
for (unsigned int i = 0; i < 6; i++)
printf("%c%c%c", *((char*)&data[i] + 2), *((char*)&data[i] + 1), *(char*)&data[i]);
}
至此,解密完成,答案是:
flag{re_is_great!}
总结:
增强了对z3的使用,了解到了TEA类似的解密