攻防世界BYEBYE(超详细)
找到主函数
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s[24]; // [rsp+0h] [rbp-20h] BYREF
int v5; // [rsp+18h] [rbp-8h]
int i; // [rsp+1Ch] [rbp-4h]
for ( i = 0; i <= 181; ++i )
*((_BYTE *)judge + i) ^= 0xCu;
printf("Please input flag:");
__isoc99_scanf("%20s", s);
v5 = strlen(s);
if ( v5 == 14 && (unsigned int)judge((__int64)s) )
puts("Right!");
else
puts("Wrong!");
return 0;
}
发现judge函数被加密,需smc解密,这里需要IDC
先找到FILE,找到Script command
输入解密代码
#include <idc.idc>
static main()
{
auto addr=0x600B00;
auto end=0x600B00+182;
auto i=0;
for(i=0;addr+i<end;i++)
{
PatchByte(addr+i,Byte(addr+i)^0xC);
}
}
run起来
找到这个区域
先按U(取消原来定义),在按C(重新生成汇编代码),最后按P(重新生成function)
进入judge函数
__int64 __fastcall judge(__int64 a1)
{
char v2[5]; // [rsp+8h] [rbp-20h] BYREF
char v3[9]; // [rsp+Dh] [rbp-1Bh] BYREF
int i; // [rsp+24h] [rbp-4h]
qmemcpy(v2, "fmcd", 4);
v2[4] = 127;
qmemcpy(v3, "k7d;V`;np", sizeof(v3));
for ( i = 0; i <= 13; ++i )
*(_BYTE *)(i + a1) ^= i;
for ( i = 0; i <= 13; ++i )
{
if ( *(_BYTE *)(i + a1) != v2[i] )
return 0LL;
}
return 1LL;
}
然后写脚本即可出flag
data='fmcd k7d;V`;np'
flag=''
for i in range(14):
flag+=chr(ord(data[i])^i)
print(flag)
flag$n1c3_j0b}