看雪CTF.TSRC 2018 团队赛 第二题 半加器
苦看无果。果断通过字符列表中的Please Input:
找到如下函数:
int __usercall sub_4A19B0@<eax>(int a1@<xmm0>)
{
int v2; // [esp+D0h] [ebp-8h]
sub_48D7B4((int)&unk_5F6007);
sub_48CD46((int)&unk_5F31E0, (int)"Please Input:");
sub_48C0EE("%s", &g_input, 30);
v2 = len((int)&g_input);
if ( v2 > 30 || v2 < 10 )
{
sub_48A6DB("输入错误;");
exit(0);
}
sub_48E5BF((int)g_input_an, 30, (int)&g_input);
if ( g_input_an[7] != 'A' )
{
sub_48A6DB("输入错误;");
exit(0);
}
sub_48D3A4(a1, (int)g_input_an);
return 0;
}
输入后检查长度在10到30之间,再检查输入第8个字符为A
,再进入sub_48D3A4
进行编码。
sub_48D3A4
调用如下函数,替换输入第8个字符,进行异或编码:
int __usercall sub_49DBD0@<eax>(int xmm0_4_0@<xmm0>, char *a1)
{
int v2; // edx
int v3; // ecx
unsigned int i; // [esp+D0h] [ebp-8h]
sub_48D7B4((int)&unk_5F6007);
a1[7] = '#';
for ( i = 0; i < len((int)a1); ++i )
a1[i] ^= 0x1Fu;
return sub_48D935(v3, v2, 1, (int)a1, xmm0_4_0);
}
再回溯往下走,又不太好找最终的check。只好通过g_input_an
的引用找到如下函数,完成参数a2
的异或编码,再与编码后的输入进行比较:
int __userpurge sub_49DC80@<eax>(int a1@<xmm0>, char *a2)
{
int v2; // edx
int v3; // ecx
unsigned int i; // [esp+E8h] [ebp-14h]
sub_48D7B4((int)&unk_5F6007);
if ( a2 )
{
for ( i = 0; i < len((int)a2); ++i )
a2[i] ^= 0x1Cu;
if ( !strcmp((int)a2, (int)g_input_an) )
{
sub_48B4AA(a1, (int)&unk_5F31E0, 'o');
sub_48B4AA(a1, (int)&unk_5F31E0, 'k');
}
}
return sub_48D935(v3, v2, 1, 0, a1);
}
此函数以下函数通过sub_48DACA
调用,参数a2
也出来了,为invalid argument
:
int __usercall sub_49CEB0@<eax>(int a1@<xmm0>)
{
int v1; // eax
int v2; // edx
int v4; // [esp+0h] [ebp-E8h]
sub_48D7B4((int)&unk_5F6007);
v1 = sub_48DACA(a1, aInvalidArgumen_1);
return sub_48D935(v4, v2, 1, v1, a1);
}
反算:
c = 'invalid argument'
f = []]
for i in range(len(c)):
append(chr(ord(c[i])^0x1c^0x1f))
f[7] = 'A'
print ''.join(f)
最终flag为:jmubojgAbqdvnfmw
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界