本帖最后由 lihaohua 于 2018-11-28 23:46 编辑
拿到题目名字已给出提示PE结构OD打开查看一下字符串
啥也莫得用PEinfo 查看一下区块发现端倪
参照了一下逆向工程核心原理
用PEditor修改一下大小E00
放OD里跑一下修改了PE区块rdata大小之后 可以看到一下数据
这里看到base64的table 猜测后面会用到base64的加密动态调试了一下发现这里的一个bug
感到很奇怪 ,调试了发现执行了int 0x2D 程序直接结束了 ,修改一下保存
发现程序能够正常运行了,继续调试会发现无论如何都不能执行到正确的输出,(也有可能是我太菜了)。
IDA启动!
看一下关键代码[Asm] 纯文本查看 复制代码 int sub_401080()
{
char v0; // ST2B_1@2
int result; // eax@5
signed int v2; // ecx@7
__int16 *v3; // [sp+18h] [bp-BCh]@1
signed int v4; // [sp+1Ch] [bp-B8h]@6
char v5; // [sp+24h] [bp-B0h]@6
char v6[127]; // [sp+25h] [bp-AFh]@8
__int16 v7; // [sp+A4h] [bp-30h]@1
int v8; // [sp+A6h] [bp-2Eh]@1
int v9; // [sp+AAh] [bp-2Ah]@1
int v10; // [sp+AEh] [bp-26h]@1
int v11; // [sp+B2h] [bp-22h]@1
int v12; // [sp+B6h] [bp-1Eh]@1
int v13; // [sp+BAh] [bp-1Ah]@1
int v14; // [sp+BEh] [bp-16h]@1
__int16 v15; // [sp+C4h] [bp-10h]@1
int v16; // [sp+C6h] [bp-Eh]@1
int v17; // [sp+CAh] [bp-Ah]@1
char v18; // [sp+CEh] [bp-6h]@1
v15 = 0;
v16 = 0;
v17 = 0;
v18 = 0;
v7 = 0;
v8 = 0;
v9 = 0;
v10 = 0;
v11 = 0;
v12 = 0;
v13 = 0;
v14 = 0;
sub_401020("first,you need make program run\n");
sub_401020("please input flag:\n");
sub_401050("%s", &v7); // input
v3 = &v7;
do
{
v0 = *(_BYTE *)v3;
v3 = (__int16 *)((char *)v3 + 1);
}
while ( v0 );
if ( v3 != (__int16 *)((char *)&v7 + 1) && strlen((const char *)&v7) < 0x1E )// flag长度
{
sub_4013F0(&v15);
sub_4012A0((const char *)&v7, (int)&v5); // base64加密
v4 = 10;
while ( 1 )
{
v2 = v4--;
if ( !v2 )
break;
if ( *((_BYTE *)&v15 + v4) != v6[2 * v4] || *(&v5 + 2 * v4) + 2 != (off_404018[v4] ^ 3) )// v15[i]=v6[i*2]||v5[2*i]+2==str1[i]^3
{
sub_401020("sry,u are wrong :(\n");
system("pause");
return 0;
}
}
sub_401020("Congratulation, flag is:\nD0g3{%s}\n");
system("pause");
result = 0;
}
else
{
sub_401020("sry,u are wrong :(\n");
system("pause");
result = 0;
}
return result;
}
大概的运算意思就是
两组数据加密奇偶穿插其中例如 str1:123456 Str2:abcdef Flag:1a2b3c4d5e6f 拿到数据之后逆运算一下[Asm] 纯文本查看 复制代码 # -*- coding: UTF-8 -*-
import base64
str1 = "LKd8gPYWS["
str2 = "2TVBnx0lnn"
flag = ''
flags = ''
#MFe9bQXRNV
for i in range(len(str1)):
flag += chr((ord(str1[i])^3) -2)
print(flag)
for j in range(10):
if j % 2 ==0:
flags += flag[j]+str2[j]
print(flags)
else:
flags += flag[j]+str2[j]
print(flags)
flags = base64.b64decode(flags)
print(flags)
#out M2FTeV9BbnQxX0RlNnVn
|