下载压缩包:
下载链接:https://adworld.xctf.org.cn/challenges/list
参考文章:攻防世界逆向高手题之secret-galaxy-300_沐一 · 林的博客-CSDN博客
发现这只是三个同一类型文件的三个不同版本而已,一个windows32位exe,另外两个分别是32位和64位的ELF的linux可执行文件,就分析32位的ELF文件吧。
扔入IDA32中查看伪代码,有main函数看main函数:
打开IDA,发现填充和输出函数,没有输入函数,寻找输入函数
两个函数,一个填充fill_starbase,一个打印print_starbase,打印的函数跟踪进去没啥,打印一些横幅和其它信息,其中v2跟踪不了,看了一下是作为参数传入的:
这里a1跟踪不了,因为是在外部的&starbase传入的,所以前面fill_starbase猜想是填充该数组的,双击跟踪:
看到一个数组&galaxy_name,还是取地址。后面是对它的一些运算,双击跟踪数组:
看到这里有点不明觉厉,因为至始至终没有flag字眼,想起我还没运行过程序,就去运行一下
运行elf文件后,出现的字符串
思路:题目是secret-galaxy-300,中文引导型暗示——隐藏的星系,运行结果显示了5个星系,而我前面跟踪的数组有6个星系,少了DARK SECRET GALAXY,那么这个就是关键点!
!
!
!
跟踪DARK SECRET GALAXY的调用,发现一个函数,代码分析如下:
// 调用DARK SECRET GALAXY的函数
int __libc_csu_gala()
{
int result; // eax
sc[0] = off_409014; // off_409014处是DARK SECRET GALAXY字符串的地址
sc[3] = &byte_40DAC0; // 一开始双击跟踪啥也没有,后面是对它的赋值操作
sc[1] = 31337;
sc[2] = 1;
byte_40DAC0 = off_409004[0][8]; // off_409004处是Andromeda字符串的地址
byte_40DAC1 = off_409010[0][7]; // off_409010处是Triangulum字符串的地址
byte_40DAC2 = off_409008[0][4]; // off_409008是Messier字符串的地址
byte_40DAC3 = off_409004[0][6];
byte_40DAC4 = off_409004[0][1];
byte_40DAC5 = off_409008[0][2];
byte_40DAC6 = 95;
byte_40DAC7 = off_409004[0][8];
byte_40DAC8 = off_409004[0][3];
byte_40DAC9 = off_40900C[0][5]; // off_40900C是Sombrero的地址
byte_40DACA = 95;
byte_40DACB = off_409004[0][8];
byte_40DACC = off_409004[0][3];
byte_40DACD = off_409004[0][4];
byte_40DACE = off_409010[0][6];
byte_40DACF = off_409010[0][4];
byte_40DAD0 = off_409004[0][2];
byte_40DAD1 = 95;
byte_40DAD2 = off_409010[0][6];
result = *((unsigned __int8 *)off_409008[0] + 3);
byte_40DAD3 = off_409008[0][3];
byte_40DAD4 = 0;
return result; // 这里犯下第三个错误,返回result,可是result是off_8049B80[3],就是Messier的第三个字符s,我醉了,难怪不显示前面一直在用 aAliensAreAroun,结果这里返回别的东西去了。
}
分析完后可以知道 aAliensAreAroun数组大概就是我们要招的flag了。
第一种方法:
手动调试,就这样不同的字符串一个个截取对应的位拼接即可。
code:
off_409004='Andromeda'
off_409010='Triangulum'
off_409008='Messier'
off_40900C='Sombrero'
flag=''
flag+=off_409004[8]
flag += off_409010[7]
flag+= off_409008[4]
flag+= off_409004[6]
flag+= off_409004[1]
flag+= off_409008[2]
flag+='_'
flag+= off_409004[8]
flag+= off_409004[3]
flag+= off_40900C[5]
flag+='_'
flag+= off_409004[8]
flag+= off_409004[3]
flag+= off_409004[4]
flag+= off_409010[6]
flag+= off_409010[4]
flag+= off_409004[2]
flag+='_'
flag+= off_409010[6]
flag+= off_409008[3]
print(flag)
#结果:aliens_are_around_us
第二种方法:
IDA远程动态调试,下断点在return处,运行:(PS:运行且调试过IDA了,所以这里的数组名字和我一开始看到的不一样,IDA应该是自己又修改过了)
总结:这是一个脑洞题,需要推理,根据运行结果找到隐藏的字符串,再根据隐藏的字符串找到关键代码,然后计算出flag