先查看它的main函数代码:
__int64 __fastcall main(int a1, char **a2, char **a3)
{
int i; // [rsp+Ch] [rbp-34h]
char s[40]; // [rsp+10h] [rbp-30h] BYREF
unsigned __int64 v6; // [rsp+38h] [rbp-8h]
v6 = __readfsqword(0x28u);
sub_A90(check, a2, a3);
fgets(s, 35, stdin);
for ( i = 0; i <= 33; ++i )
s1[i] ^= s[i];
return 0LL;
}
unsigned __int64 check()
{
unsigned __int64 v1; // [rsp+8h] [rbp-8h]
v1 = __readfsqword(0x28u);
if ( !strcmp(s1, s2) )
puts("Congratulations!");
else
puts("Wrong!");
return __readfsqword(0x28u) ^ v1;
}
它的逻辑很简单,就是s1和输入做异或,回调函数调用check函数s1与s2做对比,相同则“Congratulations”。但这样得到的结果是不对的。在s1的定义处,CTRL + x,会发现在程序init的时候,也会对s1做处理:
unsigned __int64 sub_84A()
{
int i; // [rsp+Ch] [rbp-14h]
unsigned __int64 v2; // [rsp+18h] [rbp-8h]
v2 = __readfsqword(0x28u);
for ( i = 0; i <= 33; ++i )
s1[i] ^= 2 * i + 65;
return __readfsqword(0x28u) ^ v2;
}
用下

文章讲述了如何分析一段包含main和check函数的C++代码,其中使用异或操作进行数据处理。程序初始化时会对`s1`进行额外修改,Python代码展示了如何通过逆向工程找到正确的flag。
900

被折叠的 条评论
为什么被折叠?



