【BUUCTF逆向题】[2019红帽杯]easyRE

前言:这题与前面不同。flag不在输入输出中,甚至不在main函数中,就是藏在一个隐秘的角落!

一.[2019红帽杯]easyRE

首先就是查到了upx壳然后在kali中脱壳,之后用IDA64打开静态分析

进入之后发现没有找到main函数,是start(这里我突然想到之前见过这种start开始的题,于是我找到了那一题打开的界面,和这题基本一样)按F5反编译

反编译后我发现,除了第一个参数的函数以外,其他函数除了名字不一样,里面的内容都是一样的,我去查了很多,得到的结论是:在C++语言中,main函数之前会有一个start的开始处理,会调用栈、堆等等预处理,反正这里理解其他函数都是预处理函数就行,有效函数就是第一个参数的函数,我们把它当做main函数

双击进入主函数:(当然这题也可以Shift+F12锁定主函数,但是原理该懂的还是要去搞明白)阅读程序

起始的这个空间申请就不再赘述,开头结尾可以对上验证

最后的"You found me!!!"肯定就是正确出口但是前面有个continue,先分析上面的代码吧,具体分析我写在图片中了,每一个参数的由来都解释的非常清楚,逆向学习7分靠猜,知道大概当然也能推理,但是我更倾向于练习的时候抽丝剥茧

这就可以推出v15也就是第一次输入

脚本:

python 复制代码
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)

得到字符串

python 复制代码
Info:The first four chars are `flag`

信息而已,说前4个字符是flag,不知道能干嘛,继续往下分析

就是再次对输入的v18进行base64加密处理10次处理后与已知明文验证,通过则输出正确

补充 :这可以看出来是base64加密,密钥都给了


补充 :双击off_6CC090发现是常量,再追踪发现就是base64加密后的字符串

接着解密10次得到一个网址

python 复制代码
https://bbs.pediy.com/thread-254172.htm

点进去是说主动防御的,没找到flag线索啊

到这里,懵逼了

后来知道,在off_6CC090之下有一段发现了没用到的数据

追踪发现函数sub_400D35,具体程序逻辑如图(看不懂的先不用管,后面会讲是什么)

知道v1第1位字符和最后1个字符经过异或运算后分别为f和g

结合第一段程序可以知道4个字符就是flag那么就可以反推出v1即密钥,然后就可以由明文推出所有异或的字符即flag

上脚本:

python 复制代码
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)

key为**&YA1**

flag为flag{Act1ve_Defen5e_Test}

补充 :为什么flag藏在一个只能靠数据追踪的函数中不在main函数中?对最后的函数追踪一下,Ctrl+X键,发现在.fini_array段才调用此函数,.fini_array 是正序正常退出后才执行的函数,用来清空栈等调用的资源,这也与前面的start对应上了一个在前一个在后,原来这里也能藏flag

总结:这题让我知道了flag不只会在main函数中,也了解到了start和最后fini的处理方式,这些开始和结束的段也可以作为出题的地方,在以后没有main 的题中也能更清晰的分析 。

相关推荐
Swizard6 分钟前
别再迷信“准确率”了!一文读懂 AI 图像分割的黄金标尺 —— Dice 系数
python·算法·训练
超级大只老咪24 分钟前
数组的正向存储VS反向存储(Java)
java·开发语言·python
长安牧笛44 分钟前
心理健康情绪日记分析系统,用户输入文字日记后,AI提取情绪关键词,焦虑/愉悦等,生成周情绪波动曲线,并推荐调节建议。
python
点云SLAM1 小时前
C++ Template(模板)解读和模板报错如何“逆向阅读”定位
c++·c++20·c++模版·c++高级应用·c++模版报错定位
艾上编程1 小时前
第三章——爬虫工具场景之Python爬虫实战:学术文献摘要爬取,助力科研高效进行
开发语言·爬虫·python
明洞日记1 小时前
【数据结构手册008】STL容器完全参考指南
开发语言·数据结构·c++
Hi_kenyon1 小时前
FastAPI+VUE3创建一个项目的步骤模板(二)
python·fastapi
骥龙1 小时前
4.15、AI 在网络安全中的应用与对抗:AI 驱动攻击与防御
网络安全
kingmax542120082 小时前
《数据结构C语言:单向链表-链表基本操作(尾插法建表、插入)》15分钟试讲教案【模版】
c语言·数据结构·链表
拉普拉斯妖1082 小时前
DAY38 Dataset和DataLoader
python