【NISACTF】sign-ezc++
收获
在 C++ 中,注意命名空间,在命名空间中可能会藏有相关的函数
在 IDA View-A 界面,注意汇编中数组的定义方法
db 定义时,flag 的上下两行是连着的,2 dup(59h) 指连续 2个 59h,14h dup(0) 指连续 20个 0,完整的 flag :
flag db 44h, 2 dup(59h), 49h, 5Eh, 4Ch, 71h, 7Eh, 62h, 63h, 79h, 55h, 63h, 79h, 55h, 44h, 43h, 59h, 4Bh, 55h, 78h, 6Fh, 55h, 79h, 63h, 6Dh, 64h, 77h, 14h dup(0)
思路
拖入 IDA 查找 main 函数
没有发现什么有用信息
shift + F12
查看字符串:
发现几个可能与 flag 有关的输出提示信息,查看这几个内容:
这几句提示信息分别位于函数 Human::introduce(void)
和 Man::introduce(void)
内,且这两个函数仅仅是两句输出,没有其他功能
但是注意到 main 函数中并未调用这两个提示函数,不过可知存在两个命名空间,一个是 Human,一个是 Man
搜索这两个命名空间中的函数:
发现在 Human 的命名空间中有一个叫 Human::give_flag(void)
的函数
查看 Human::give_flag(void)
的内容:
查看 flag 中的内容:
将程序跑一遍应该就是 flag
脚本
#include <iostream>
#include <string.h>
using namespace std;
int main(){
char flag[48] = {0x44, 0x59, 0x59, 0x49, 0x5E, 0x4C, 0x71, 0x7E, 0x62, 0x63,
0x79, 0x55, 0x63, 0x79, 0x55, 0x44, 0x43, 0x59, 0x4B,
0x55, 0x78, 0x6F, 0x55, 0x79, 0x63, 0x6D, 0x64, 0x77,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0,
0, 0, 0, 0, 0, 0, 0};
for (int i = 0; i < 48; ++i ){
flag[i] ^= 0xAu;
}
cout<<flag;
return 0;
}
结果
NSSCTF{this_is_NISA_re_sign}
评论