【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 的题中也能更清晰的分析 。

相关推荐
程序员小远4 分钟前
接口自动化测试框架(pytest+allure+aiohttp+ 用例自动生成)
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest
钮钴禄·爱因斯晨30 分钟前
赛博算命之 ”梅花易数“ 的 “JAVA“ 实现 ——从玄学到科学的探索
java·开发语言·python
进阶的小叮当1 小时前
Vue+Node调用Python并将结果显示到Web页面中
vue.js·python·node.js
《雨声》2 小时前
第3章《VTK可视化基础》
开发语言·c++·qt·算法
Perfect_www2 小时前
Jupyter Notebook自动保存失败等问题的解决
ide·python·jupyter
蚰蜒螟2 小时前
mysql8 C++源码中创建表函数,表字段最大数量限制,表行最大存储限制
c++·mysql
好想写博客2 小时前
[深度学习]神经网络-回归项目
pytorch·python·深度学习·神经网络·回归·numpy·pandas
一晌小贪欢2 小时前
Python办公笔记——将csv文件转Json
笔记·python·json·python办公·python读取csv
大雄野比2 小时前
Kotlin 循环与函数详解:高效编程指南
开发语言·python·kotlin