GeekChallenge 2023 re wp
前言
感觉有点尴尬,这个wp并不全,因为本人打算在比赛结束后写出此文,然后发现靶场的题全下完了,然后自己也没有备份,呃呃怎么办呢?只能凭印象了,想到哪道题就写哪道题罢,然后Ida的界面的东西也没有(因为题目被我删了)只剩解密脚本了凑合着看。。。
0x01 shiftjmp
die查壳,发现是无壳的ELF64文件,直接拖入ida64
按tab发现无法生存伪代码,发现这里有两处错误。
这两处错误是花指令,花指令详情见花指令 - CTF Wiki (ctf-wiki.org)
第一处是无意义跳转,第二处是jmp造成的脏字节。
把jz和imp都nop掉。
undefine (U)然后按 c生存代码 按p生存函数main
非常简单的异或加密,写个python脚本解密
1 | enc='SXAxS6jd8doTxBQ{x"Ma'+chr(0x27)+r"csE-|El,o/{^\\" |
flag:SYC{W3lc0me_tO_th3_r3veR5e_w0r1d~}
0x02 点击就送的逆向题
没什么好说的,Linux.s文件编译,打开虚拟机按照下面步骤手动编译就好了
gcc -c test.s -o test.o
gcc test.o -o test
这里补充一下c语言编译步骤:
1、预处理
gcc -E test.c -o test.i
2、用intel汇编代码来编译
gcc -s -masm=intel test.i -o test.s
3、汇编器将汇编代码转化为机器码
gcc -c test.s -o test.o
4、链接调用输出
gcc test.o -o test.out
之后拖到ida分析编译好的test文件,简单位移加密逆向后可以解出来。
0x03 AES!!AES?
简化版的AES加密,没有列混合和生成多个子密钥进行轮密钥加
【AES加密算法】| AES加密过程详解| 对称加密| Rijndael-128| 密码学| 信息安全_哔哩哔哩_ bilibili AES算法详细见这个视频)
照着ida里面的加密步骤逆出解密脚本就好了
1 | S=[0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, |
(s表是手打的,当时不知道ida能快捷键Shift+E提取文本数据)
SYC{0.o_Thls_1s_n0t_A3s_(q^_^p)}
0x04 miku
这是一道golang逆向题,评价是完全看不懂,发现main函数里有一个叫rc4加密的函数,盲猜是rc4加密。传入的key通过静态分析很难找,直接Linux远程动调,运行程序后有一个输入初音未来色,经过百度查找是39c5bb,正确输入后经过动态调试发现生成了正确的key 0x43,手搓一个rc4对称解密脚本直接逆出flag
1 | #rc4对称加密流程 |
SYC{N0thing_1s_sEriOus_But_MIku}
0x05 幸运数字
感觉没啥好说的,题目说0到999有存在幸运数字,经过分析只要找出任意一个luck丢进逆向脚本就能出flag,由于幸运数字的范围小,直接爆破出来就好了
1 | #前n项求和公式 |
SYC{C0ngratulati0nnnns_You_gAessEd_R1ght}
0x06 黄鸭
丢进die发现是PyInstaller封装的exe,py逆向,用pyinstxtractor 进行反编译
1 | python pyinstxtractor.py test.exe |
之后根据python的版本更改关键pyc文件的魔术头(PyObject_HEAD)魔术头的版本号可以通过查看struct文件了解。(不知道为什么我的pyin……弄出来后的pyc魔术头总是对不上号,这时可以用010editor去更改)
转自独奏の小屋
在线网站可以反编译pyc,python反编译 - 在线工具 (tool.lu)
uncompyle也可以,详情见uncompyle6
找到关键的加密代码,看不懂是什么语法。。但也可以猜出来是一个向右移动13位的凯撒加密了,之后再将其他细节补全,逆出解密脚本
1 | enc = '~h|p4gs`gJdN`thPwR`jDn`te1w`2|RNH' |
SYC{1_h0pe_yOu_ChAse_YoUr_dr3ams}
0x07 砍树
砍树是一道安卓逆向题,但本质感觉还是ida。考察了apk文件的本质是一个压缩包,将.apk改成.zip后解压就能发现里面的函数library,找到一个像颜文字一样的函数。这个函数在jadx静态分析界面里面是找不到的,是调用了某个外部库,然后是此题的关键加密函数。
找到这个函数后,拖到ida里面分析出来是个什么玩意,找到key=“Sycloverforerver”,逆出解密脚本
1 | enc=[0,0x20,0x20,0x17,0x1b,0x36,0x0e,0x36,0x26, |
SYC{t@ke_thE_bul1_By_the_h0rns_TAT}
0x08 扎针游戏
此题是一个unity引擎的游戏,源自见缝插针。游戏引导玩家去扎30根针,可是扎完后发现还要再扎到40根。受不了这鸟气,在附带文件里面找到Assemble-Csharp.dll,丢进c#反汇编工具ILspy里面查看,查找相关字符串就可以定位到关键代码了,一个游戏流程控制代码,这里经过分析后会检测你鼠标点击的次数和扎针扎的分数,要达到100分。但是看不出解密方法。
问过大佬1k0ct后,他说用CE可以来修改score,改到100分。直接炫了一个Cheat Engine,找了一下修改方法将分数改到100,发现解出了错误flag。
后面分析发现前30次每次扎完针都会通过异或加密刷新一次密文,之后在score达到100时在游戏左上角显示出来。
之后手动扎30次针,再将score改到100,就出现了正确的flag。
0x09 rainbow
控制流平坦化,在ida里面导入了一个D-810的插件,可以将消去控制流平坦化,什么是控制流平坦化呢????利用符号执行去除控制流平坦化 - 博客 - 腾讯安全应急响应中心
自己看看吧,我也不知道。
1 | enc = [0x65,0x58,0x41,0x8e,0x50,0x44,0x7b,0x62, |
SYC{TAke_1t_3asy_Just_a_STart!!}
0x0A TEA
这是一道安卓逆向TEA,flag根据下标的奇数和偶数被分为两部分,偶数部分经过一次变种TEA加密后得到密文enc,奇数部分与enc异或得到密文enc1。
除了变种TEA外,本题的字符存储为int32位数据是是大端序存储的,注意这两点关键后就可以解出题目了(jadx里面的密文enc1被putExtra了,需要查找一个getExtra函数找到获取这个密文的代码文件,跳转过去后就能看到上面所说的enc1和异或加密操作了)
1 | enc2=[-107, -106, -95, -115, -119, 127, 26, 121, -62, -20, 86, 9]#奇数部分的密文 |
得到密文enc的大端序存储数
0xa5f892c9
0xcf4b730d
0xb48f6650
这个是明文的奇数部分
0n3DF4itvc0Y
1 |
|
将上述密文enc和奇数部分明文输入脚本,再将密钥key啥的弄好,包裹一下SYC输出就好了
这里提一嘴int类型和unsigned int类型(简称uint),在做题时我把密文enc的数据类型设为了uint,导致后面输出的结果是错的后面查资料才发现,int类型和uint在按位运算时,前者是算术位移,后置是逻辑位移,举个例子:char a=1111 1111,>>2后是1111 1111,符号位不变
而uchar 1111 1111 ,>>2后是0011 1111,没有符号位,两者是有区别的,会影响到十六进制数的大小。
SYC{0Tn03VDtF343iTtnv0ci0tYr}
0x0B easymath
看起来就像是一个平平无奇的阅读ida代码然后写脚本的题,但是好难逆啊,结合提示整了一个z3库来约束一下条件,正向爆破出flag。
下载一个z3的库
1 | pip install z3-solver |
下载完后我打开pycharm然后发现 怎么都用不了,没办法,只能搞一个vscode来写
如何用vscode配置C语言环境? - 知乎 (zhihu.com)(这里放一个无关紧要的相关文章)
vscode写蟒蛇只要选个解释器就好了非常的简单。
ida里红色框框出的是核心的代码,需要爆破的关键。就是一个矩阵的乘法加法啥的,不用管当普通的加法乘法来算就好了。目的是求出last
这里有几个给定的值, 把这些提前约束好,应该是防止爆破出多解的。
这几个函数大概的逻辑就是在flag的每一个字符,在table里面找到对应的值,并取下标然后储存到position里面,接着再用这个下标在number里面取值存到last里面,这几个步骤都是很好逆向的,所以只要求出last就好了。
1 | from z3 import* |
记得是之前听1k0ct说一次性爆出last会很慢很慢,我之后就改成了一次出last一行
i用来取行的序号,然后这里last的19,22,什么的是根据他给的t,y正推出来的,就根据那几个函数的步骤手动推出last 的已知解。然后就是不知道是什么的语法,这些查文档就好了吧(心虚)
flag已忘,望周知