实验吧逆向,reversemeplz
拿到题目后,首先查看文件格式,发现是32位ELF可执行文件,放到32位linux环境下执行,随便输入一个字符串,结果打印出"Wrong input!"。放入IDA中分析,可以看到主函数十分清晰,只有一个sub_8048801函数对输入字符串进行判断是否正确,进入这个函数,经分析,可以看出这个函数主要由两个循环体组成,第一个循环体将sub_8048519过程应用于我们的输入字符串的每个字符形成一个新的字符串并存入局部变量,进入sub_8048519中,发现这个函数写得比较复杂,直接进行逆向分析会耗费许久,所以将其当作黑盒利用动态调试的方式来理解其功能。开启gdb-peda,在调用该函数处下断点,观察返回值,若调用前eax寄存器为'a',则调用后返回'na',但存储的时候只取al即'n',经过多次实验后发现这个函数即一个移位13的移位加密,即'a'->'n','b'->'o'···;接着看下面的循环结构,发现它将我们输入并进行移位加密后的字符串相邻字符ascii码之差与另一连续的内存数据进行比较,只有全部相等才有机会正确。而这片连续的内存数据在sub_8048801函数开始处通过一个qmemcpy函数复制而来,我们找到这片数据段,由于是每4个字节进行一次比较,最终可以得到一个序列[-1, 17, -11, 3, -8, 5, 14, -3, 1, 6, -11, 6, -8, -10]。由于需要返回值为1才正确,而这个返回值是:输入的第一个字符经13移位替换后的值是否等于98('b')这个条件的真假,说明正确的第一个字符为'o'。通过函数中的几个条件跳转又可知输入字符串长度为15。现在所拥有的信息已足够,写出脚本即可获得flag。
2016国赛,GeekDoll
查看文件格式为64位ELF可执行程序,运行后随意输入字符串,打印出Nope说明错误。放入IDA,发现程序结构与普通C程序完全不同,怀疑是用的某种框架或是其他语言编写,去网上查询后得知是用Haskell语言编写的程序,在github获得反编译的工具,进行反编译后获得Haskell源码,完全看不懂,于是稍微学习了下Haskell的基本语法,重新去看代码时,发现该代码主要用了一个很长的case嵌套语句来比较命令行参数中字符与某个变量,若相等则输出一个新的变量,显然这也是一个替换加密算法,很长的case嵌套语句就是替换表,而下方有变量名与对应的值,且最终的替换完的字符串也是已知的,为bk_vefuhfuhfuha1n4shaqcz,根据替换表将该字符串还原即可得到flag
IDA retdec反编译mips插件的安装
之前有做到过mips程序的题目,但mips指令实在不熟悉,所以需要一个反编译工具,这个工具的安装真是耗费了我大量的时间,不过也都怪自己官方文档没看仔细。
经历:在github上找到retdec,按照其流程安装插件,retdec本体,msys2等,配置完成后发现IDA插件无法工作,让选择输入文件时,总是报错说该文件无法找到。经过仔细查看了官方文档后,发现问题出在了msys2的环境配置上,但将路径加入了全局环境变量后依然不行,于是运行了msys2程序,发现类似一个虚拟机或者说子系统,它只能访问该文件夹内部的文件,无访问外部,而retdec中的shell文件需要由msys2来运行,于是将retdec整个文件夹移动到了msys64的内部,然后把要反编译的文件也放了进去,这时用IDA打开这个文件才终于反编译成功。