BUUCTF-[2019红帽杯]easyRE(Reverse逆向)

简介: 本文详细介绍了对一个无壳的64位ELF文件进行逆向分析的过程。首先通过IDA查找关键字符串定位主函数,然后逐步分析函数逻辑,包括读取输入、异或操作等。接着通过多次Base64解码和异或操作,最终得到了关键的flag。整个过程涉及数组寻址、条件判断和函数调用等技术细节,展示了CTF竞赛中常见的逆向工程技巧。最后附上了完整的Python代码实现,帮助读者理解和复现。

第一步 查壳

如图,无壳,ELF文件

image.png

第二步 IDA

64位IDA,无法直定位到主函数F5,所以使用,查找关键字符串定位主函数大法Shift+F12

image.png

发现这些关键字符串,双击上图蓝色字符串,

image.png

然后交叉引用Ctrl+X跟踪

image.png

来到流程图,直接F5大法

进来又是一代对数据,我直接全部手动转化为了字符

image.png

然后下面的一堆函数,进入菜狗模式,借鉴大佬的猜测

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

果然,做ctf就得是要大胆猜测呀,继续分析,如图注释所示

image.png

涉及数组寻址方式数据结构之——数组 - 知乎 (zhihu.com)

所以,为了防止程序跳转,所以得知,正确数据应该是,v14数组内存里的数据(也即是上面第一次出现的一堆我手动转化的字符)去异或它的下标。

代码部分

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

得到运行结果是

Info:The first four chars are `flag`

那么问题还没有结束,所以继续往下看,前面还是类似上面的前面,输入然后判断,重点是点进入令人头大的sub_400E44函数,但是有经验的就会知道,还记得上面第二张截图那一大片绿色的字符串吗,底下有一串abcdefghijklmn数组字符串,这在sub_400E44函数中同样也出现了,可以直接点击跟踪,所以可以猜测sub_400E44函数就是base64加密。而且还加密了十次。

image.png

sub_400E44函数

image.png

(手动狗头,这是大佬的代码:)也可以直接手动用工具解密:

import base64
lis ="Vm0wd2VHUXhTWGhpUm1SWVYwZDRWVll3Wkc5WFJsbDNXa1pPVlUxV2NIcFhhMk0xVmpKS1NHVkdXbFpOYmtKVVZtcEtTMUl5VGtsaVJtUk9ZV3hhZVZadGVHdFRNVTVYVW01T2FGSnRVbGhhVjNoaFZWWmtWMXBFVWxSTmJFcElWbTAxVDJGV1NuTlhia0pXWWxob1dGUnJXbXRXTVZaeVdrWm9hVlpyV1hwV1IzaGhXVmRHVjFOdVVsWmlhMHBZV1ZSR1lWZEdVbFZTYlhSWFRWWndNRlZ0TVc5VWJGcFZWbXR3VjJKSFVYZFdha1pXWlZaT2NtRkhhRk5pVjJoWVYxZDBhMVV3TlhOalJscFlZbGhTY1ZsclduZGxiR1J5VmxSR1ZXSlZjRWhaTUZKaFZqSktWVkZZYUZkV1JWcFlWV3BHYTFkWFRrZFRiV3hvVFVoQ1dsWXhaRFJpTWtsM1RVaG9hbEpYYUhOVmJUVkRZekZhY1ZKcmRGTk5Wa3A2VjJ0U1ExWlhTbFpqUldoYVRVWndkbFpxUmtwbGJVWklZVVprYUdFeGNHOVhXSEJIWkRGS2RGSnJhR2hTYXpWdlZGVm9RMlJzV25STldHUlZUVlpXTlZadE5VOVdiVXBJVld4c1dtSllUWGhXTUZwell6RmFkRkpzVWxOaVNFSktWa1phVTFFeFduUlRhMlJxVWxad1YxWnRlRXRXTVZaSFVsUnNVVlZVTURrPQ=="
for i in range(10):
    lis = base64.b64decode(lis)
print(lis)

解密结果是:b'https://[bbs](https://so.csdn.net/so/search?q=bbs&spm=1001.2101.3001.7020).pediy.com/thread-254172.htm'

这是一个i春秋的论坛页面,被迫学习了,主动防御,这是什么天坑题目,直接没思路,看大佬wp

我们需要其他的线索,联想到第一个提示信息,翻译说前四个字符是"flag",发现下面标黄的地方还有一段字符串byte_6CC0A0

image.png

根据后面的交叉引用跟踪进去看,sub_400D35函数--看我的注释很令人头大,但重点看if

image.png

发现此函数的逻辑就是将byte_6CC0A0字符串进行异或,还可以发现if语句中,有判断是否等于‘f’和‘g’的条件,根据已有信息猜测这个字符数组就是‘flag’。v12和v15是一样的一个数组,HIBYTE()函数的作用是获取高字节也就是数组的最后一位,同时还有BYTE()、BYTE1()、BYTE2()第一个是获取数组的第一位,第二个就是获取第二位,依次类推。所以可以知道v15这个数组就只有四个字符而且和byte_6CC0A0前4个字符异或后就==字符“flag”。

然后我们来说说交叉引用Ctrl+X

对sub_400D35函数进行交叉引用;发现来自.fini段的调用;

而.fini段的解释是

此节区包含了可执行的指令,是进程终止代码的一部分。程序正常退出时,系统将安排执行这里的代码。

“oh my god 又是什么新知识增加了”

image.png

image.png

编写算法

enc = [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]
key = ""
flag = ""
en = "flag"
for i in range(4):
    key+=chr(enc[i]^ord(en[i]))
print(key)
for j in range(len(enc)):
    flag+=chr(enc[j]^ord(key[j%4]))
print(flag)

结果如图,这题真费劲

image.png

得出

key为&YA1

flag为flag{Act1ve_Defen5e_Test}

总结

最后,声明下我借鉴得大佬的文章:

(29条消息) 2019 红帽杯 easyRE_[2019红帽杯]easyre_mishixiaodai的博客-CSDN博客

(29条消息) BUUCTF-re-[2019红帽杯]easyRE_T1M@的博客-CSDN博客

2019 红帽杯 Re WP - Hk_Mayfly - 博客园 (cnblogs.com)

(29条消息) re学习笔记(25)BUUCTF-re-[2019红帽杯]easyRE_buuctf re题_Forgo7ten的博客-CSDN博客

再写是因为自己再复现了一遍,希望加深印象,增强理解

如有错误,欢迎感谢支出,并参与讨论。

借鉴引用注明出处,谢谢理解!

相关文章
|
7月前
BUUCTF easyre 1
BUUCTF easyre 1
64 0
|
22小时前
|
安全 数据安全/隐私保护 Python
BUUCTF-[GUET-CTF2019]re(Reverse逆向)
本文介绍了如何对一个带有UPX壳的ELF文件进行逆向分析。首先通过010Editor确认文件类型和壳的存在,接着使用Free UPX工具进行脱壳。脱壳后在IDA中加载文件,通过字符串查找和交叉引用跟踪定位关键函数。最终利用Python的z3库解决约束问题,得到flag。过程中还遇到了Python版本兼容性问题,并通过重新安装z3-solver解决。最终flag为`flag{e165421110ba03099a1c039337}`,经MD5解密验证为`233`。
7 0
BUUCTF-[GUET-CTF2019]re(Reverse逆向)
|
22小时前
|
数据安全/隐私保护
BUUCTF-CrackRTF(Reverse逆向)
本文介绍了BUUCTF中的CrackRTF题目解题过程。首先确认程序未加壳,运行后发现是一个猜密码游戏。通过IDA反汇编分析,找到加密函数并构造爆破代码,成功破解第一段密码。接着利用ResourceHacker查看资源,结合异或运算破解第二段密码。最终输入两段密码后生成带有flag的rtf文件,得到flag为`flag{N0_M0re_Free_Bugs}`。文中详细记录了每一步的操作和分析过程。
6 0
BUUCTF-CrackRTF(Reverse逆向)
BUUCTF---新年快乐(reverse)
BUUCTF---新年快乐(reverse)
BUUCTF---内涵的软件(reverse)
BUUCTF---内涵的软件(reverse)
攻防世界---easyRE1
攻防世界---easyRE1
|
7月前
|
C++
【PTA】​L1-062 幸运彩票 ​ (C++)
【PTA】​L1-062 幸运彩票 ​ (C++)
103 0
【PTA】​L1-062 幸运彩票 ​ (C++)
2022天梯赛三月冲刺——PAT (Advanced Level)1013 Battle Over Cities (并查集找连通块)
2022天梯赛三月冲刺——PAT (Advanced Level)1013 Battle Over Cities (并查集找连通块)
114 0