前言
博主的RE入门系列来到了第十期,这次是NISA2022的题,恰巧明天就是NISA2023校赛的日子,而且本篇博客也会和0xA
扯上点关系
缘,妙不可言(
知识点
c++
命名空间
异或
题目
下载题目附件得到exe程序,拖入ida并f5查看main函数
乍一看找不到flag相关的信息,但是发现有两个不一样的命名空间Man
和Human
两个都打开看看发现指向同一段地址(?)(目前博主不确定叫什么
打开此地址发现Human::give_flag
这个函数
打开此函数可以看到flag相关的异或操作
将flag
按位与0xA
进行异或
思路
知识补充
C++命名空间
解决命名冲突的问题
类似于同名函数在不同的类以防止冲突,逆向时或许可以当类中的函数处理(?
操作
这里flag
参数是可以查看内存中的值
两行db后绿色的值就是flag
值的每一位(十六进制)
2 dup(59h)
说明连续出现两次
于是得到flag
的值为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,0x14
然后编写python脚本执行异或获取题目的flag
flag=[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,0x14]
for i in flag:
print(chr(i^ord('\n')),end="") # ord(‘\n’)==0xA
>>>NSSCTF{this_is_NISA_re_sign}
总结
初步了解命名空间相关的逆向方法