一道逆向题,在吾爱论坛下载。
压缩包,打开之后两个文件。
使用peid查看文件,使用c++编写,32位文件。放入ida中查看,什么都看不懂,出题人肯定做过处理。根据题目应该便是加入了花指令。
花指令:加入程序中,作用便是使反汇编出现的代码很难看懂。这些指令迷惑作用,将它们全部删除也不会影响程序的执行。所以ida反编译便会很乱。
目前我知道的放法便是放入od中,一段一段找到这些花指令。然后全部使用nop填充
但会相当费时间,有时候还可能找错。不过当把花指令全部去掉之后,便可以使用ida进行分析。(吾爱破解论坛中便是这么做的)
使用od分析
花指令并不影响动态调试,所以可以不管这些。od载入之后,在winxp中出现问题。提示该程序无效。
嗯,不知道是怎么回事,先在win10上进行。
载入之后,单步运行发现有一个“.\file"的提示,在程序执行完毕后出现”error in open file“的字样。所以函数应当是打开名为“file”的文件,之后将其中内容读取后,进行运算。
在程序同目录下创建一个file文件,随便写入一段字符串。再次运行。
输出结果为
开始单步调试,这一过程因为对于函数不熟练,找了很长时间的加密部分。直到看到其中一段出现调用base函数,才算找到加密的方向。根据函数调用次数推断出进行了4次base运算。
**** 将四个字符串组合起来,合成一个。(这里还有一个问题,od找找看~)****
接下来问题就来了,超长的循环。硬是看了几个小时。 ━┳━ ━┳━
分析过程,有点乱
在一段循环中,进行运算,产生一个新的字符串.(其中“628e205d”)便是正在产生的字串,给的提示是(“%s%.2hhx")意思便是将字符串按照16进制保存
循环过程中产生的字符串:"628e205dbb"
在这里每个字符加上:0x10,得到下方字符串。
od分析流程:便是flag进行四次base64进行加密,之后合并成一个字符串,之后base64加密。并且每个字符+0x10。产生的字符串便储存在:flag.enc中,逆向之后获得flag
FFIF@@IqqIH@sGBBsBHFAHH@FFIuB@tvrrHHrFuBD@qqqHH@GFtuB@EIqrHHCDuBsB
qurHH@EuGuB@trqrHHCDuBsBruvHH@FFIF@@AHqrHHEEFBsBGtvHH@FBHuB@trqrHH
ADFBD@rquHH@FurF@@IqqrHHvGuBD@tCDHH@EuGuB@tvrrHHCDuBD@tCDHH@Furu
B@tvrIH@@DBBsBGtvHH@GquuB@EIqrHHvGuBsBtGEHH@EuGuB@tvrIH@BDqBsBIFEH
H@GFtF@@IqqrHHEEFBD@srBHH@GBsuB@trqrHHIFFBD@rquHH@FFIuB@tvrrHHtCDB
@@
接下python写的脚本:
s="FFIF@@IqqIH@sGBBsBHFAHH@FFIuB@tvrrHHrFuBD@qqqHH@GFtuB@EIqrHHCDu
BsBqurHH@EuGuB@trqrHHCDuBsBruvHH@FFIF@@AHqrHHEEFBsBGtvHH@FBHuB@trq
rHHADFBD@rquHH@FurF@@IqqrHHvGuBD@tCDHH@EuGuB@tvrrHHCDuBD@tCDHH@F
uruB@tvrIH@@DBBsBGtvHH@GquuB@EIqrHHvGuBsBtGEHH@EuGuB@tvrIH@BDqBsBIF
EHH@GFtF@@IqqrHHEEFBD@srBHH@GBsuB@trqrHHIFFBD@rquHH@FFIuB@tvrrHHtCD
B@@"
s1=""
for i in s:
s1 +=(chr(ord(i)-0x10))s2=b''
s2 =bytes.fromhex(s1)s3 =base64.b64encode(s2)
s4 =''fori inrange(len(s3)//4):
s4 +=hex(s3[i*4])[2:]s4 =bytes.fromhex(s4)
print(s4)
for i in range(4-(len(s4)%4)):
s4 +=b'='s5 =base64.b64decode(s4)print(s5)
flag{juck_code_cannot_stop_you_reversing}
下面是根据ida分析结果,是看着论坛来的。我自己去花指令出错了
1.先对原始字符串base64加密一次,之后再每个字符加上+0x40
2.之后再次对新的字符串再base64加密,并每个字符<<7
3.再次对新字符串进行一次加密,每字符-0x9E
4.最后对新字符串加密一次
5.最后一个没有看出来,是看其他人的wp。对前面每一步加密后的字符串排序,为b1,b2,b3,b4之后将它们每个字符依次取出来如下:b1第一个字符,b2第一个字符,b3第一个字符,b4第一个字符,b2第二个字符,b2第二个字符,b3第二个字符,b4第二个字符.........
在这里便会发现分析结果跟od有些区别,部分操作比od更清楚。但是这样的话,对于我来说写逆向运算代码复杂度更大。。。
网友评论