新手第一次见这种题,记录一下
压缩包给了一个exe还有一个png.out,那个png.out不知道干嘛用的。
查一下exe有无加壳,无,拖入ida进行分析。
程序流程不难,就是先从tea.png读入数据,然后经过中间的函数处理,然后把输出输出到tea.png.out。
题目要我们做的就是,用那个out文件,还原出png文件
进入4010A0函数,发现ida根本分析不了:
原来这就是传说中的花指令。
看了别的大佬博客才知道,对于00401116,有红色的这行语句按U,然后在Hex-view那里,把那行数据改成90
选change byte,整行删掉然后输入90就行。
然后在这行按P,变成函数,然后发现能F5了。
发现是个原始tea加密。
接下来就是写脚本解密了
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<sstream>
#include<queue>
#include<list>
#include<stack>
#include<bitset>
#include<iomanip>
#include<set>
#include<cmath>
#include<map>
#include<functional>
//#define int long long
#define IO ios::sync_with_stdio(false)
#define _BYTE unsigned char
#define HIBYTE(x) (*((_BYTE*)&(x)+1))
#define eps 1e-8
using namespace std;
int ans[500005];
const int N=500003;
void decrypt(int *v,int k[])
{
int v0=v[0], v1=v[1], sum=0xC6EF3720, i;
int delta=0x9e3779b9;
int k0=k[0], k1=k[1], k2=k[2], k3=k[3];
for (i=0; i<32; i++) {
v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
sum -= delta;
}
v[0]=v0; v[1]=v1;
}
signed main()
{
int k[6]={0x67616C66,0x6B61667B,0x6C665F65,0x7D216761};
FILE *fp=fopen("tea.png.out","rb");//学到了,读图片可以用读二进制的方式打开
fread(ans,sizeof(int),N,fp);//我也不知道这个文件要读多少东西进去,直接弄个很大的数让他读就好了
fclose(fp);
for(int i=0;i<N;i+=2)
{
decrypt(ans+i, k);
}
fp = fopen("tea.png", "wb");
fwrite(ans, sizeof(int), N, fp);
fclose(fp);
}
最后会输出一个这样的图片