收获

  • 在 C++ 中,注意命名空间,在命名空间中可能会藏有相关的函数

  • 在 IDA View-A 界面,注意汇编中数组的定义方法

NISACTF-sign-ezc++0.png

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)

【NISACTF】sign-ezc++


思路

拖入 IDA 查找 main 函数

NISACTF-sign-ezc++1.png

没有发现什么有用信息

shift + F12 查看字符串:

NISACTF-sign-ezc++2.png

发现几个可能与 flag 有关的输出提示信息,查看这几个内容:

NISACTF-sign-ezc++3.png

这几句提示信息分别位于函数 Human::introduce(void)Man::introduce(void) 内,且这两个函数仅仅是两句输出,没有其他功能

NISACTF-sign-ezc++4.png

但是注意到 main 函数中并未调用这两个提示函数,不过可知存在两个命名空间,一个是 Human,一个是 Man

搜索这两个命名空间中的函数:

NISACTF-sign-ezc++5.png

发现在 Human 的命名空间中有一个叫 Human::give_flag(void) 的函数

查看 Human::give_flag(void) 的内容:

NISACTF-sign-ezc++6.png

查看 flag 中的内容:

NISACTF-sign-ezc++7.png

将程序跑一遍应该就是 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}

NISACTF-sign-ezc++8.png