IDA打开
int __cdecl main(int argc, const char **argv, const char **envp)
{
Human *v3; // rbx
Human *v4; // rbx
char v6[23]; // [rsp+20h] [rbp-20h] BYREF
char v7; // [rsp+37h] [rbp-9h] BYREF
Human *v8; // [rsp+38h] [rbp-8h]
_main(argc, argv, envp);
std::allocator<char>::allocator(&v7);
std::string::string(v6, "NISACTF", &v7);
v3 = (Human *)operator new(0x18ui64);
Man::Man(v3, v6, 4i64);
v8 = v3;
std::string::~string((std::string *)v6);
std::allocator<char>::~allocator(&v7);
(*(void (__fastcall **)(Human *))(*(_QWORD *)v8 + 8i64))(v8);
v4 = v8;
if ( v8 )
{
Human::~Human(v8);
operator delete(v4);
}
return 0;
}
这个代码一看很懵逼
我们也找不到成功标志
但是看下面由个if(v8)
if很关键(想想你们以前做的)
直接根据if的操作
来到human
void __fastcall Human::~Human(Human *this)
{
*(_QWORD *)this = off_4863D0;
std::string::~string((Human *)((char *)this + 16));
}
继续跟进
哎!
真的有个flag
看看这个flag
有三个调用,都看看
结果都是在一个地方
三个flag调用
size_t __fastcall Human::give_flag(Human *this)
{
size_t result; // rax
int i; // [rsp+2Ch] [rbp-54h]
for ( i = 0; ; ++i )
{
result = strlen(flag);
if ( i >= result )
break;
flag[i] ^= 0xAu;
}
return result;
}
直接根据这个写代码
a='DYYI^Lq~bcyUcyUDCYKUxoUycmdw'
flag=''
for i in a:
flag+=chr(ord(i)^0xA)
print(flag)
得到
NSSCTF{this_is_NISA_re_sign}