writeup--echo server
最近在做逆向的题,在xctf实训平台上找了一下,挑了个比较简单的来做
题目描述:
Input the secret, output the flag.
下载地址
下载之后发现是elf,先拖ida里面看一下,发现很多个函数都识别不出来,都是出现call xxxxx+1的情况,这个很明显就是插入了E8或者其他东西造成ida识别错误,
首先看一下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和[email protected]给nop掉
嗯,好看多了
下面还有一段是乱码的
但是看了半天,发现并没有其他代码是跳转到这里的,那就直接nop掉吧。。。
最后变成这样
然后选择patch program那里的Apply patchs to input file
接下来就很简单了,基本就是常规的分析,输入[email protected]就可以得到flag了
F8C60EB40BF66919A77C4BD88D45DEF4