极客wp

极客wp

点击就送的逆向题

发现文件后缀名是.s

gcc命令其实依次执行了四步操作:

1.预处理(Preprocessing)

2.编译(Compilation),

3.汇编(Assemble),

4.链接(Linking)。

GCC编译过程(预处理->编译->汇编->链接) - 知乎 (zhihu.com)

通过上述内容发现还需要先将汇编代码.s变成机器码.o,生成目标文件

在虚拟机里面进行

a2d5158a58c6d18755b59e46bbe6103a.png

然后把得到的目标文件拖64IDA里面,观察逻辑发现处理后得到的s1和s2相等,再推回去即可

90d0a9715d3dcdee04498c8f5d208a9c.png

9b657dac96012ce3b07e77690e1c8cb3.png

幸运数字

拖进DIE发现是PE64,搞64位IDA里面去

a74a56791c4338fff2860ffa5d5752db.md.png

8bc3d63e470aeb29d7976619d0623346.png

由上面二图可知,对&Format,&Buffer,&byte_40401C点进去a一下得下图,cmp_data存的是ascii,所以注意46行存储数据的处理,转换成对应的ascii,这个地方刚好只存了5个字符到数组中,得到对应的数据为111, 57, 54, 42, 35

76bf846c9319db536c7d48e43060a9aa.png

cc3329e3d5dcaaac28b90f185d59a2ab.md.png

对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

587e59f04c3844ae08f84141af5a07e2.png

取余记得用 int 取整

防止数据超出ascii码表值,所以&0xFF,取低八位或者直接%256

1b6cbeb5cb83824acd5b16c483c5bfdc.md.png

最后记得对输出的字符串进行筛选……

shiftjmp

piBJS1O.md.png

进到main函数里面以后发现无法生成反汇编代码

汇编跳转指令有问题

因为jz前为rax和rax的异或 值为0

所以执行jz后的指令 跳转到 loc_117A+1,为117B

发现中间地址被折叠了

所以对着117A地址D一下,得到下图

piBJPnH.md.png

piBJV4P.png

指令地址不连续,把0E9h在下方按F2改成0x90,空指令对应机器码,nop,地址连续,然后选中p一下

就可以生成反汇编代码了

piBJe9f.md.jpg

逻辑可知得到0,异或回去

注意把rodata字符串转换成ASCII形式就可以了

piBJMuQ.png


极客wp
http://example.com/2023/12/18/极客wp-1/
作者
John Doe
发布于
2023年12月18日
许可协议