攻防世界easyhook
题目流程
int __cdecl main(int argc, const char **argv, const char **envp)
{
HANDLE FileA; // eax
DWORD NumberOfBytesWritten; // [esp+4h] [ebp-24h] BYREF
char Buffer[32]; // [esp+8h] [ebp-20h] BYREF
printf(aPleaseInputFla);
scanf("%31s", Buffer);
if ( strlen(Buffer) == 19 )//判断flag长度是否为19
{
sub_401220(); //关键的加密函数
FileA = CreateFileA(FileName, 0x40000000u, 0, 0, 2u, 128u, 0u);
WriteFile(FileA, Buffer, 19u, &NumberOfBytesWritten, 0);
sub_401240(Buffer, &NumberOfBytesWritten);//没什么用的函数
if ( NumberOfBytesWritten == 1 )
printf(aRightFlagIsYou);
else
printf(aWrong);
system(Command);
return 0;
}
else
{
printf(aWrong);
system(Command);
return 0;
}
}
经过查找翻看找到关键函数: 该函数对flag(也就是a1)进行加密
sub_401000(lpBuffer, nNumberOfBytesToWrite);
int __cdecl sub_401000(int a1, int a2)
{
char i; // al
char v3; // bl
char v4; // cl
int v5; // eax
for ( i = 0; i < a2; ++i )
{
if ( i == 18 )
{
*(a1 + 18) ^= 19u;
}
else
{
if ( i % 2 )
v3 = *(i + a1) - i;
else
v3 = *(i + a1 + 2);
*(i + a1) = i ^ v3;
}
}
v4 = 0;
if ( a2 <= 0 )
return 1;
v5 = 0;
while ( byte_40A030[v5] == *(v5 + a1) ) // 每一位相比较,都相同则将返回1,成功。
{
v5 = ++v4;
if ( v4 >= a2 )
return 1;
}
return 0;
}
根据加密的过程写出逆向脚本:
#include <stdio.h>
int main()
{
char flag[] = {0x61, 0x6A, 0x79, 0x67, 0x6B, 0x46, 0x6D, 0x2E, 0x7F, 0x5F, 0x7E, 0x2D, 0x53, 0x56, 0x7B, 0x38,
0x6D, 0x4C, 0x6E};
int i;
int v5;
char v3 = flag[18];
for(i=18;i>=0;i--)
{
if(i == 18)
{
flag[18] = flag[18] ^ 19;
}
else
{
if(i%2)
{
flag[i] = (flag[i] ^ i)+i;
}
else
{
flag[i] = flag[i-2] ^ (i-2);
}
}
}
printf("%s",flag);
return 0;
}
这道题学到的一点就是在逆向分析加密的过程时要一步一步根据正向加密的流程,先在一段理解正向的过程 再细致地分析解密的公式等。
flag{Ho0k_w1th_Fun}