博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019 红帽杯 easyRE
阅读量:675 次
发布时间:2019-03-17

本文共 1881 字,大约阅读时间需要 6 分钟。

记一次被带入坑的逆向

拿到题目,发现是elf文件,拖入Linux运行程序,发现什么提示也不给,输入任意字符串,程序退出。

在这里插入图片描述

拖入64位的ida中,查找字符串,发现几个很有用的字符串,查看第三个字符串处的代码

在这里插入图片描述

先给了一大串数字,将类型转变成char[36]后如下图所示。分析伪代码发现函数名都是统一的sub_

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

进入第一个函数sub_4406E0,发现很难理解此函数是干嘛的,但通过主程序,我们可以猜测,该函数的作用应该是读取我们的输入。同理,根据if语句中的v15[i] ^ i) != v14[i],我们也可以猜测函数sub_424BA0是读取长度的。这样,continue前的逻辑就分析出来。

编写脚本,爆破出第一处的输入,脚本如下

v17=[0]*36v17[0] = 73v17[1] = 111v17[2] = 100v17[3] = 108v17[4] = 62v17[5] = 81v17[6] = 110v17[7] = 98v17[8] = 40v17[9] = 111v17[10] = 99v17[11] = 121v17[12] = 127v17[13] = 121v17[14] = 46v17[15] = 105v17[16] = 127v17[17] = 100v17[18] = 96v17[19] = 51v17[20] = 119v17[21] = 125v17[22] = 119v17[23] = 101v17[24] = 107v17[25] = 57v17[26] = 123v17[27] = 105v17[28] = 121v17[29] = 61v17[30] = 126v17[31] = 121v17[32] = 76v17[33] = 64v17[34] = 69v17[35] = 67flag1=[]for i in range(36):    for key in range(32,127):        if key ^ i == v17[i]:            flag1.append(chr(key))print(''.join(flag1))

爆破出的结果是Info:The first four chars are `flag`

继续分析剩下的逻辑,我们进入sub_400E44函数中,唉,又是难以理解的代码但是我们发现一串很长的字符串,包含了所有的英文字母和数字还有其他字符,每当看到这样的字符串时,我们就可以猜测,这是进行了一次base64编码。base64的编码原理可以参考

在这里插入图片描述

我们发现,这个函数被调用了十次,也就是说进行了十次base64的编码。编码后的结果和off_6CC090比较(猜测sub_400360是strcmp函数),将这一大串字符串,进行十次base64解码,得到的结果是一个。

在这里插入图片描述在这里插入图片描述

进入网站看一下,发现内容是主动防御,就感觉自己被骗了,这根本就没有flag。看来出题者是想现教现学啊。 被带入坑后,我们需要其他的线索,联想到第一个提示信息,说前四个字符是’flag’。同时,我们可以发现在那一大串base64编码的字符串下,还有一组数据,进入其函数查看。

在这里插入图片描述

发现此函数的逻辑就是将byte_6CC0A0字符串进行异或,还可以发现if语句中,有判断是否等于‘f’和‘g’的条件,根据已有信息猜测这个字符数组就是‘flag’。为什么v2会是一个数组呢,因为HIBYTE()函数的作用是获取高字节也就是数组的最后一位,同时还有BYTE()、BYTE1()、BYTE2()第一个是获取数组的第一位,第二个就是获取第二位,依次类推。

在这里插入图片描述

编写脚本,将v2和flag爆破出来。脚本如下

key2=[0x40,0x35,0x20,0x56,0x5D,0x18,0x22,0x45,0x17,0x2F,0x24,0x6E,0x62,0x3C,0x27,0x54,0x48,0x6C,0x24,0x6E,0x72,0x3C,0x32,0x45,0x5B]key3='flag'key4=[]flag=[]for x in range(4):    key4.append(chr(key2[x] ^ ord(key3[x])))print(key4)for i in range(25):    flag.append(chr(key2[i]^ord(key4[i%4])))print(''.join(flag))

得到的flag为flag{Act1ve_Defen5e_Test}

转载地址:http://dxgqz.baihongyu.com/

你可能感兴趣的文章