本文主要是介绍[NISACTF 2022]sign-ezc++,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
IDA打开
int __cdecl main(int argc, const char **argv, const char **envp)
{Human *v3; // rbxHuman *v4; // rbxchar v6[23]; // [rsp+20h] [rbp-20h] BYREFchar v7; // [rsp+37h] [rbp-9h] BYREFHuman *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; // raxint 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}
这篇关于[NISACTF 2022]sign-ezc++的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!