64位
我先用虚拟机跑了一下这个程序,结果输出一串字符串+flag ——没用
IDA打开后 F5也没有什么可看的
那我们就F12查看字符串找可疑信息
这里一下就看见了
__int64 __fastcall main(int a1, char **a2, char **a3)
{
char *v3; // rbx
__int64 v4; // rax
__int64 v5; // rdx
__int64 v6; // rax
__int64 v7; // rdx
_BYTE *v8; // rax
__int64 v10[2]; // [rsp+10h] [rbp-60h] BYREF
char v11[47]; // [rsp+20h] [rbp-50h] BYREF
char v12; // [rsp+4Fh] [rbp-21h] BYREF
__int64 v13; // [rsp+50h] [rbp-20h] BYREF
int v14; // [rsp+5Ch] [rbp-14h]
if ( a1 != 2 )
{
v3 = *a2;
v4 = std::operator<<>(&std::cout, "Usage: ", a3);
v6 = std::operator<<>(v4, v3, v5);
std::operator<<>(v6, " flag\n", v7);
exit(0);
}
std::allocator::allocator(&v12, a2, a3);
std::string::basic_string(v11, a2[1], &v12);
std::allocator::~allocator(&v12);
v14 = 0;
v10[0] = std::string::begin(v11);
while ( 1 )
{
v13 = std::string::end(v11);
if ( !(unsigned __int8)sub_400D3D(v10, &v13) )
break;
v8 = (_BYTE *)sub_400D9A(v10);
if ( *v8 != off_6020A0[dword_6020C0[v14]] )
sub_400B56();
++v14;
sub_400D7A(v10);
}
sub_400B73();
std::string::~string(v11);
return 0LL;
}
这个就是我们运行程序得到的东西
正常来说
这个while(1)和if里面比较关键——经验之谈,你们也可以联想一下写过的
先看第一个sub
bool __fastcall sub_400D3D(__int64 a1, __int64 a2)
{
__int64 v2; // rbx
v2 = *(_QWORD *)sub_400DAC(a1);
return v2 != *(_QWORD *)sub_400DAC(a2);
}
__int64 __fastcall sub_400DAC(__int64 a1)
{
return a1;
}
...就是一个比较函数
按N改名
__int64 __fastcall sub_400D9A(__int64 a1)
{
return *(_QWORD *)a1;
}
第二个函数,就是一个复制,姑且叫他get吧
_QWORD *__fastcall sub_400D7A(_QWORD *a1)
{
++*a1;
return a1;
}
最后这个也是一个简单的++操作
最后就是这样了
关键的关键就是if
off就是我们之前找到的那个字符串
dword就是一串数据
我们先脚本走下
a=[36, 0, 0, 0, 0, 0, 0, 0, 5, 0,
0, 0, 54, 0, 0, 0, 101, 0, 0, 0,
7, 0, 0, 0, 39, 0, 0, 0, 38, 0,
0, 0, 45, 0, 0, 0, 1, 0, 0, 0,
3, 0, 0, 0, 0, 0, 0, 0, 13, 0,
0, 0, 86, 0, 0, 0, 1, 0, 0, 0,
3, 0, 0, 0, 101, 0, 0, 0, 3, 0,
0, 0, 45, 0, 0, 0, 22, 0, 0, 0,
2, 0, 0, 0, 21, 0, 0, 0, 3, 0,
0, 0, 101, 0, 0, 0, 0, 0, 0, 0,
41, 0, 0, 0, 68, 0, 0, 0, 68, 0,
0, 0, 1, 0, 0, 0, 68, 0, 0, 0,
43, 0, 0, 0]
b=[]
for i in range(0,len(a),4):
b.append(a[i])
print(b)
a='L3t_ME_T3ll_Y0u_S0m3th1ng_1mp0rtant_A_{FL4G}_W0nt_b3_3X4ctly_th4t_345y_t0_c4ptur3_H0wev3r_1T_w1ll_b3_C00l_1F_Y0u_g0t_1t'
flag=''
for i in b:
flag+=a[i]
print(flag)
结果就出来了