刘功瑞的博客

有一天你突然惊醒,发现这一切,都只不过是一场梦。

攻防世界 XCTF Reverse echo-server Writeup(花指令,汇编修复)

下载之后发现是elf,先拖ida里面看一下,发现很多个函数都识别不出来,都是出现call xxxxx+1的情况,这个很明显就是插入了E8或者其他东西造成ida识别错误,
首先看一下main函数
main

有一个loc_80487C1+3,双击跳转到对应代码段看一下

这里写图片描述

发现全都是数据,这个时候在call near ptr 915A4B8Fh处按下D,将代码转化为数据

这里写图片描述

很明显这里是插入了一个E8让ida误以为这是一个函数调用
在080487C2处按下C,将数据转化为代码,再把下面的数据全部转换为代码。
在E8处点击一下,然后选择选择栏的Edit,再选择Patch program 的change byte
然后出现下面的对话框
这里写图片描述

将E8改成90,这里的90是nop的意思,就是什么都不干
然后在刚刚的Patch program那里选择Apply patchs to input file
再次打开ida,然后就会看到原来是数据的地方现在变成了代码

这里写图片描述

但是下面还是有类似的状况,然后全部按照上面的方法来改
但是这个时候发现有一个地方比较奇葩
这里写图片描述
自己跳转到自己+1的地方。。。这跟nop有什么区别。。。
果断把它变成数据,然后在0EB的下一个按C
这里写图片描述
嗯,这样好看多了
但是多出一个0EB怎么办?果断nop掉他,和上面改E8一样改就行
接着看下面,发现
这里写图片描述
xor eax,eax,这样eax无论是什么值都会变成0
然后再jz跳转,其实就相当于无条件跳转,下面的jmp之类的都是无效的代码。
但是把下面的代码改成数据之后发现一个熟悉的字符串
这里写图片描述
再按一下A,把数据改成字符串
这里写图片描述
果然是flag。。但是其实在我第一次尝试的时候我是直接把这里给nop掉,然后后面反汇编成c语言的时候发现要输入一个字符串和一个已有的字符串比较,但是我给nop掉了。。。所以那个地址就很迷,然后后面再试的时候就发现这里是在代码段存了一个字符串。。。但是很明显在代码段存的字符串是不能用的,那么我们去数据段找一下吧
这里写图片描述
看来是提前给好了一个flag,但是看了一下,两个字符串是不同的,很明显是要上面那一个,那么改一下,选择patch program那里的change byte

46 31 40 67 5F 00 59 6F 75 20 61 72 65 20 76 65
改成
46 31 40 67 41 00 59 6F 75 20 61 72 65 20 76 65
然后把下面mov dword ptr[esp+4] , 8048817h的8048817改成数据段的flag的地址
点击这一行代码,选择change byte

C7 44 24 04 17 88 04 08 8D 45 90 89 04 24 E8 08
改成
C7 44 24 04 DA 89 04 08 8D 45 90 89 04 24 E8 08
再把上面的那个E9和F1@gA给nop掉

这里写图片描述

嗯,好看多了
下面还有一段是乱码的
这里写图片描述
但是看了半天,发现并没有其他代码是跳转到这里的,那就直接nop掉吧。。。
最后变成这样
这里写图片描述

然后选择patch program那里的Apply patchs to input file
接下来就很简单了,基本就是常规的分析,输入F1@gA就可以得到flag了
F8C60EB40BF66919A77C4BD88D45DEF4


发表评论:

Powered By Z-BlogPHP 1.5.2 Zero

Copyright www.liugongrui.com.All Rights Reserved.