1.先用file命令查看文件基本信息,文件为64位ELF文件,剥去了符号表信息。
2.用checksec查看文件,文件加了upx壳。
3.ida静态分析,大概只看到了几个地址和长度。
4.gbd动态调试一下,发现起始地址是从0x400000开始的,一运行程序自动退出,应该是开启了反调试,那么下面直接运行程序,把内存dump出来看看。
5.直接运行程序,从0x400000开始,尝试dump出来一些内存,字节长度尝试2997072。dump了快10分钟,真的dump了一些东西。
6.ida分析dump出来的文件
找到start函数,start函数中赋值给rdi的就是main函数了,找到main函数,就好分析了。
看这段代码,关键就是要分析sub_4009AE函数,结果点开以后,直接告诉flag是错误的。
思路一下就断了,这个函数应该是估计是个假函数,那么就用那个关键字符串再搜索一下,看看有没有其他地方还有提示。查找发现“Enter the flag:”出现了两次,第一次就是上面的函数,那现在来看看下面那个地方。
分析这段汇编代码,发现用户输入的字符串存到了unk_6CCDB0中。
对这段代码进行反编译,提示没有函数,那么新建一个函数,在jle跳转指令之后添加一个函数。这样按f5就能反编译了。
看到了核心算法部分。输入的字符串格式应该为qwb{XXXXXX},中间有16个字符.输入字符串存储在unk_6CCDB0中,而后面处理的数组为unk_6CCDB4, 刚好是中间那16个字符。
分析代码发现,数组主要进过两个函数处理,共处理六次,最后得到的加密数组qword_4C8CB0逐位比较,相等即可。
qword_4C8CB0为16字节采用小端存储,所以恢复成字节数组时,要逆序。
函数sub_4C8CC0 主要是通过中间的for循环进行加密。
sub_4C8E50函数进行逐字节异或处理。
最后加密要得到的目标数组即为qword_4C8CB0。
至此程序已经分析完毕。
7.加密算法逆向。