-
-
[原创]第五题分析
-
发表于: 2016-11-10 20:45 2015
-
第五题分析
从上图可以看出密码共6位,且大于等于0x30,小于等于0x39,即为纯数字。
上图两个函数调用为关键调用。
IDA F5
signed int __cdecl sub_401000(int a1, int a2)
{
unsigned __int8 v2; // dl@1
char *v3; // edi@1
signed int v4; // eax@1
int v5; // eax@3
char v6; // cl@4
signed int result; // eax@7
char *v8; // ecx@7
signed int v9; // [sp+10h] [bp-108h]@3
char v10; // [sp+18h] [bp-100h]@1
char v11; // [sp+19h] [bp-FFh]@1
__int16 v12; // [sp+115h] [bp-3h]@1
char v13; // [sp+117h] [bp-1h]@1
v2 = 0;
v10 = 0;
memset(&v11, 0, 0xFCu);
v12 = 0;
v13 = 0;
v3 = &v10;
v4 = 0;
do
{
*(&v10 + v4) = v4;
++v4;
}
while ( v4 < 256 );
v5 = 0;
v9 = 256;
do
{
v6 = *v3;
v2 += *v3 + *(_BYTE *)(v5++ + a1);
*v3 = *(&v10 + v2);
*(&v10 + v2) = v6;
if ( v5 == a2 )
v5 = 0;
++v3;
--v9;
}
while ( v9 );
result = 0;
v8 = &v13;
do
{
byte_406030[result] ^= *v8 + *(&v10 + result);
++result;
--v8;
}
while ( result < 128 );
return result;
}
上面函数利用输入的密码对406030处代码解密,正确解密才能正确运行。
BOOL sub_4010C0()
{
__int64 v0; // rdi@1
signed int v1; // ecx@1
v0 = 0i64;
v1 = 0;
do
v0 += (unsigned __int8)byte_406030[v1++];
while ( v1 < 128 );
return v0 == 10617;
}
上面函数对406030处共128字节逐个相加,判断和是否为10617,是则意味着正确解密。
因为密码才6位,且范围窄,暴力搜索非常快,遂代码搜索之,得到771535,附上代码。
从上图可以看出密码共6位,且大于等于0x30,小于等于0x39,即为纯数字。
上图两个函数调用为关键调用。
IDA F5
signed int __cdecl sub_401000(int a1, int a2)
{
unsigned __int8 v2; // dl@1
char *v3; // edi@1
signed int v4; // eax@1
int v5; // eax@3
char v6; // cl@4
signed int result; // eax@7
char *v8; // ecx@7
signed int v9; // [sp+10h] [bp-108h]@3
char v10; // [sp+18h] [bp-100h]@1
char v11; // [sp+19h] [bp-FFh]@1
__int16 v12; // [sp+115h] [bp-3h]@1
char v13; // [sp+117h] [bp-1h]@1
v2 = 0;
v10 = 0;
memset(&v11, 0, 0xFCu);
v12 = 0;
v13 = 0;
v3 = &v10;
v4 = 0;
do
{
*(&v10 + v4) = v4;
++v4;
}
while ( v4 < 256 );
v5 = 0;
v9 = 256;
do
{
v6 = *v3;
v2 += *v3 + *(_BYTE *)(v5++ + a1);
*v3 = *(&v10 + v2);
*(&v10 + v2) = v6;
if ( v5 == a2 )
v5 = 0;
++v3;
--v9;
}
while ( v9 );
result = 0;
v8 = &v13;
do
{
byte_406030[result] ^= *v8 + *(&v10 + result);
++result;
--v8;
}
while ( result < 128 );
return result;
}
上面函数利用输入的密码对406030处代码解密,正确解密才能正确运行。
BOOL sub_4010C0()
{
__int64 v0; // rdi@1
signed int v1; // ecx@1
v0 = 0i64;
v1 = 0;
do
v0 += (unsigned __int8)byte_406030[v1++];
while ( v1 < 128 );
return v0 == 10617;
}
上面函数对406030处共128字节逐个相加,判断和是否为10617,是则意味着正确解密。
因为密码才6位,且范围窄,暴力搜索非常快,遂代码搜索之,得到771535,附上代码。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
- [原创]看雪.TSRC 2017CTF秋季赛第三题分析 6520
- [原创]CTF2017第二题分析 3358
- [原创]第一题答案 2373
- [原创]TX2017游戏安全知识竞赛第二轮第二题 8222
谁下载
看原图
赞赏
雪币:
留言: