极客wp
极客wp
点击就送的逆向题
发现文件后缀名是.s
gcc命令其实依次执行了四步操作:
1.预处理(Preprocessing)
2.编译(Compilation),
3.汇编(Assemble),
4.链接(Linking)。
GCC编译过程(预处理->编译->汇编->链接) - 知乎 (zhihu.com)
通过上述内容发现还需要先将汇编代码.s变成机器码.o,生成目标文件
在虚拟机里面进行
然后把得到的目标文件拖64IDA里面,观察逻辑发现处理后得到的s1和s2相等,再推回去即可
幸运数字
拖进DIE发现是PE64,搞64位IDA里面去
由上面二图可知,对&Format,&Buffer,&byte_40401C点进去a一下得下图,cmp_data存的是ascii,所以注意46行存储数据的处理,转换成对应的ascii,这个地方刚好只存了5个字符到数组中,得到对应的数据为111, 57, 54, 42, 35
对v5进行处理,发现是个递归,k在0-999,则取k=0,此时返回值为result(-1)+0;取不到result(-1),因为k为unsigned,
所以k=0时返回值为0;
取k=1,返回值为1
取k=2,返回值为1+2
…………
故v5 = (1+k)*k/2
取余记得用 int 取整
防止数据超出ascii码表值,所以&0xFF,取低八位或者直接%256
最后记得对输出的字符串进行筛选……
shiftjmp
进到main函数里面以后发现无法生成反汇编代码
汇编跳转指令有问题
因为jz前为rax和rax的异或 值为0
所以执行jz后的指令 跳转到 loc_117A+1,为117B
发现中间地址被折叠了
所以对着117A地址D一下,得到下图
指令地址不连续,把0E9h在下方按F2改成0x90,空指令对应机器码,nop,地址连续,然后选中p一下
就可以生成反汇编代码了
逻辑可知得到0,异或回去
注意把rodata字符串转换成ASCII形式就可以了