跳至主要内容

0xGame 2025 Week1 Reverse WP

引言

  • 我是一名入门的CTF玩家,看了看0xGame 2025 Week1 Reverse官方的WriteUp,感觉写的太简略了,这边以新手的视角开启0xGame 2025 Week1 Reverse

SignIn

  • 这个题目我们需要准备好IDA,我在这里下载的[原创] IDA Pro 9 安装和插件配置-安全工具-看雪论坛-安全社区|非营利性质技术交流社区 (kanxue.com),下载的那个打包好的IDA Pro 9.2.7z,然后运行下InitIDA.exe,就可以正常使用了,进入页面我把默认取消了,所以和初始化不一样,但进入页面应该看的懂吧,我记得我点的Own,然后把exe可执行文件拖到里面
  • 然后默认OK,Yes(我也看不懂啥意思,但应该默认就行)
  • 进入之后可以按空格 (space) 键可以将线性视图切换为 CFG,展示该函数的控制流程图。
  • 该题并没有用到这个东西哈
  • 这个WriteUp写的也是很直接,直接Shift+F12就能看到flag了
  • 因为字符串是硬编码在程序内部,因此用记事本、winhex等文本编辑工具其实也能看
  • 用x64dbg也是可以的,在https://sourceforge.net/projects/x64dbg/files/snapshots/中下载
  • 打开x64dbg
  • 这样配置一下dbg,将signin的exe文件拖进去,在反汇编窗口右键(就是左上角的窗口)
  • 搜索一下匹配特征,在ASCII栏中输入0xGame,然后回车
  • 双击第一个就能看到flag了

SignIn2

  • 这个需要下载赛博厨子(cyberchef),下载链接https://github.com/gchq/CyberChef/releases/
  • 点开SignIn2文件后,记得回车一下,然后按照流程走可以得到一个加密的@Wq}u-guAs@}CoBoyq!y~yuo##oA@F@DDIE@I/,我们复制到cyberchef的input里面,在signin2中有提示告诉我们是ROT47 Brust Force,然后我们在Search中搜索ROT47 Brute Force,不知道是提示故意给错的还是怎么样,应该是搜索ROT47 Brute Force,然后你就会发现出现了一堆东西,我们只需要在Crib框中输入0xGame就能看到flag了

EasyXor

  • 这是一个未知的文件,按照WriteUp所写,一般遇到不认识的文件,先扔到DIE或者其它的文件查询工具里面查查看。下载一下DIE,https://github.com/horsicq/DIE-engine/releases,下载die_win64_portable_3.10_x64.zip文件。
  • ![](Images/084054b08x9fi6qi2k2022 1.png)
  • 查看得知是ELF64文件,直接拖进IDA
  • 进去后按F5查看c语言伪代码(伪代码只可参考,不可全信)
  • 然后可以去问ai这段代码是干什么的,这边直接引用官方WriteUp的Python脚本了
1
2
3
4
5
enc=[0x42,0x1A,0x39,0x17,0x1D,0x9,0x51,0x55,0x2C,0x5F,0x63,0xC,0xD,0x16,0x62,0x27,0x55,0x64,0x55,0x26,0x6D,0x6A,0x18,0x34,0x88,0x65,0x6E,0x1C,0x21,0x6E,0x3D,0x23,  
0x6A,0x25,0x6B,0x63,0x68,0x7E,0x77,0x75,0x9A,0x7D,0x39,0x43]
key = 'raputa0xGame2025'
for i in range(len(enc)):
    print(chr((enc[i]-i)^ord(key[i % len(key)])),end='')
  • 然后就是这个enc哪来的,返回到伪代码页面
  • 双击它就能看到存储的信息了
  • 如果你是下载的那个9.2.7z的话会自带插件,可以一键dump数据,不过有点bug?光选择那些不行,我得多选择一行才能完全dump出来,所以dump出来的数据需要删一点
  • Dump as python list(byte)
  • 我只是讲一下这个数据的来源哈
  • 那个脚本可以直接复制进最下方的python栏执行
  • 复制到python栏中回车,再回车一下就出来了

DyDebug

  • 看了看官方的WriteUp用的IDA调试,IDA的调试并没有那么好,所以这边我们用x64dbg来解题
  • 拿到题当然也是先去IDA看一看,看一下伪代码,理解一下题之后才能知道需要调试
  • 丢到IDA里面看到主函数出来特别⻓、特别复杂一大串,其中的加密也很复杂难懂,但实际上可以注意到这里的比对是拿我们的输入去和解密出来的字符串比较,因此在程序运行的时候其实flag就在程序内部,我们要做的其实只是让程序“停”在某个位置,然后查看一下解出来的v6,这个就是flag
  • 把程序拖进x64dbg,配置和之前的一样,然后也和之前一样,只不过这次搜索的是==字符串==
  • 我们会发现有个”Pity!”字样双击进入反汇编窗口
  • 可以搜索一下jg,je和jz的区别啊,这里在je下个端点(F2),重新运行一下,F9,输入数字
  • ![](Images/084041qlss8llk1lhsdgxc 1.png)
  • 然后你就会发现flag已经出现了,直接在右边窗口复制复制符号即可

BaseUpx

zzz

  • 拖进IDA,看伪代码,发现x的方程不仅有加法乘法,还有位运算,这种问题适合用z3求解器来做,也可以根据题目得知是z3
  • 我也不知道这是什么玩意,怎么看出来的,就积累经验吧XD
  • 简单说下怎么在IDA内置的Python上安装z3吧
1
2
import pip  
pip.main(['install','z3-solver'])

  • 具体看图片吧,懒得打字了,我先卸载了一遍,后安装了一遍。然后就是把WriteUp的脚本复制到Python栏中回车再回车
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from z3 import *  
import hashlib
def sha256(s):
    return hashlib.sha256(s.encode()).hexdigest()
s = Solver()
x1, x2, x3, x4 = BitVecs("x1 x2 x3 x4", 32)
s.add(3 * x2 + 5 * x1 + 7 * x4 + 2 * x3 == -1445932505)
s.add(2 * (2 * (2 * x2 + x3) + x1) + x4 == -672666814)
s.add(7 * x2 + 3 * x1 + 5 * x4 + 4 * x3 == 958464147)
s.add(((x1 ^ x2) << 6) + ((x3 >> 6) ^ 0x4514) == 123074281)
if s.check() == sat:
    m = s.model()
    print(m)
solutions = []
while s.check() == sat:
    m = s.model()
    solutions.append(m)
    s.add(Or(x1 != m[x1], x2 != m[x2], x3 != m[x3], x4 != m[x4]))
print(f"找到 {len(solutions)} 个解")
for sol in solutions:
    X1, X2, X3, X4 = (
        sol[x1].as_long(),
        sol[x2].as_long(),
        sol[x3].as_long(),
        sol[x4].as_long(),
    )
    print(f"X1, X2, X3, X4 = {X1}, {X2}, {X3}, {X4}")
    flag = f"0xGame{{{X1:08x}{X2:08x}{X3:08x}{X4:08x}}}"
    if (
        sha256(flag)
        == "4aba519d4666f5421488afaaf89efdcbe48e7a53f814ce5c1d82b46b55032651"
    ):
        print(flag)
  • 脚本怎么写我也不会,慢慢学吧,只能慢慢攒经验了
  • 写题解还真挺累的XD

需要题目文件请去https://www.ctfplus.cn/自取

关于本文

由 GuQing 撰写,采用 CC BY-NC 4.0 许可协议。

#Reverse_Writeup