给萌新们介绍介绍 虽然我也是大一萌新啊…
https://down.52pojie.cn/Tools/ 各种工具的链接
re基础
必备工具:
ida 逆向必备 不多说
jadx 安卓反编译 直接看逻辑 很好用
Androidkiller 安卓逆向 也可 但是没有反编译
PEiD:查壳 分析文件的
kali:一个系统 装虚拟机里面吧 里面好多工具也很好用
包括但不限于以上工具
前置知识:
C语言基础 常见库函数你得懂吧
百度bing Google github等网站的搜索学习能力
各种常见算法 如异或 base系列 基本的排序啥的算法
汇编 RE必备 很难学 但是也得啃 可以看书 也可以看小甲鱼的视频
Python语言 不说学深的 但得能写脚本 调库 各种常见库的使用
推荐书籍:
《加密与解密》:看书看不懂就百度吧 前置知识自己补
Re 怎么打开
很简单的一道题目 主要帮助大家熟悉ida工具的使用
下载ida工具 注意ida安装后会有两个图标 一个是ida 用于32位分析 一个是ida64用于64位程序分析
本题使用ida64 (如果你用错了后面他会提示你的
点击Go按钮
如有别的提示一路点ok就行
拖拽文件到主界面
会有很多你看不懂的东西 但是慢慢来 不用着急
左侧是函数区 右边是主窗口 如果右边不一样可以尝试按F5 这个快捷键是反编译为c代码 可以利于理解一些
我们可以看到右边调用了函数 其中一个参数为Str 有些可疑 我们双击查看
可以看到在下方有flag{ShiFt_F12}的字样
这就是我们的flag
根据题目要求应该提交格式为dino{}
所以提交dino{ShiFt_F12}
得分!
eeeasy_re
使用ida打开该文件
按F5进行反编译
直接看到答案
flag{Enc0ura9e_e4ch_0the3}
更改格式为
dino{Enc0ura9e_e4ch_0the3}
提交即可
游戏时间
新生可以看一下 但是做不出很正常 不要灰心(我也是第一次听说dnspy这个反编译工具的
游戏是我们部门大佬自己写哒!
出题人写的wp
正常人都应该玩了一下吧 但是发现游戏完成100分目标就是1000…
好像能涨到几百万 我的第一反应是使用ce修改游戏 通过简单查找就可以搜索到分数 将分数改为几个亿后弹出成功的提示 并获得了一半的flag 后半截找不到
后来了解到可以反编译.net程序的dnspy工具
下载后双击打开
点击左上角文件 打开
选择游戏目录下GameStart_DataManaged的Assembly-CSharp.dll文件
因为unity游戏不做特殊处理的话 源码默认在这个dll中储存
可以看到这个文件中在这个目录下有一个名称中含flag的部分
题目要求我们找Dino{xxxxxxx}格式的 我们可以使用ctrl+f快捷键搜索
定位到如图部分
简单分析可以发现他是将974进行了两层函数加密
点击sha1函数发现是内置正常函数
(sha1是一种加密算法 可以百度直接加密
点击md5函数 发现该函数重构了
双击md5跳转到相关函数
Public Shared Function md5(str As String) As String
Dim bytes As Byte() = Encoding.UTF8.GetBytes(str)
Dim array As Byte() = MD5.Create().ComputeHash(bytes)
Dim stringBuilder As StringBuilder = New StringBuilder()
For Each b As Byte In array
stringBuilder.Append(b.ToString("X2"))
Next
Return stringBuilder.ToString().Substring(0, 30)
End Function
就是先转大写 再输出前30位
所以找在线工具~
md5及相关加密解密工具
在salt框输入974
底下可以看到
复制 转大写 当然可以手打 也可以上脚本写
a="da39a3ee5e6b4b0d3255bfef95601890afd80709" print(a.upper())
得到DA39A3EE5E6B4B0D3255BFEF95601890AFD80709
还去哪个网页加密
md5加密后得到d41d8cd98f00b204e9800998ecf8427e
取前三十位
得到flag应该是Dino{d41d8cd98f00b204e9800998ecf842}
提交答案 发现不对 尝试大写
Dino{D41D8CD98F00B204E9800998ECF842}
你会写代码嘛?
对不起 我不会
还是ida打开分析
双击main_0函数 简单跟进
22行出现了一个变量Str 双击可以看到他的值(绿色的部分 一串都是 )较乱 先暂且不分析他 回到刚才的函数
35行使用了一个库函数 cout 并和v12变量有关 所以我们分析34行的函数 双击进入
再跟进
发现主要函数逻辑是一个循环 判断是否相等 不相等则抛出return 1
其中进行了异或操作
大胆猜想前面发现的混乱的字符串是不是与异或(即^)有关
异或的逆运算是异或 比如A^B得到C C^B得到A
写python脚本试探解密
a = "FlagNotFoundYYDS"
b=[0x02,0x05,0x0f,0x08,0x2d,0x1b,0x12,0x3d,0x5e,0x43,0x56,0x02,0x6b,0x6f,0x74,0x61,0x6b,0x59,0x02,0x51,0x79,0x42,0x40,0x7e,0x0a,0x13,0x43,0x5d,0x3c,0x69,0x73,0x7e,0x25,0x0a,0x02,0x50,0x7a,0x0b,0x12,0x77,0x59,0x10,0x5d,0x51,0x24]
for index in range(len(b)):
print(chr(ord(a[index%len(a)])^b[index]),end="")
运行得到结果
Dinoctf{168f2602-5c67-48ef-9e07-cfc74df16e35}



