青少年CTF Reverse 合集
张三的程序
code1:shift+f12
code2:点击写出日志在C盘根目录生成flag.txt
So_easy
64位程序用ida打开,main函数发现
base64解码
JRE
jadx打开
python脚本
1 | str = [180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65] |
上上签
remain
走出迷宫的数字就是flag
ida分析main函数,也有密码
flag:flag{66666666622224484444422}
CHARS
发现一串字符串
ascii解码之后 }esrever_ot_ysae_s’tI{galf
1 | python脚本 |
ManyCheck
三层验证,前两层拉入ida看或者直接用计算器算出结果:77、55、49
第三层根据ida里的算法,直接写个for循环就出来了:1198089844
1 |
|
see what you see
查看字符串就可以看到flag
flag:qsnctf{I_Am_a_loser}
Mobile01
程序安装打开之后就有flag
flag:qsnctf{so_easy_Mobile_test_for_you}
ezandroid
关键函数
跟踪得到值
python解密
1 | str = [404, 220, 436, 368, 220, 436, 412, 452, 432, 200, 412] |
用户名:ccadwjlyah 密码:f4n_4ndro1d
登录成功
flag:DASCTF{1df456_34hjfk_y3o5c_99gh34_3ndro1d}
……
1 | https://bbs.qsnctf.com/thread-363-1-1.html |
flag{re_is_so_easy}
Puzzle
1 | https://www.moxinwangluo.cn/Moxin/20354.html |
mfc
- 使用查壳工具查壳,得知题目是MFC应用,没有加壳
- 利用IDA反编译程序,如果程序需要验证flag,那么必须先获取输入的文本,在Import界面搜索text,利用交叉引用找到关键函数,分析关键验证函数
- 分析得知,程序使用了异或算法对输入加密,然后与密文比对。
- 手动提取密文的十六进制,异或回去即可
1 | c = [0xe1, 0xeb, 0xe6, 0xe0, 0xfc, 0xb6, 0xe1, 0xe3, 0xb2, 0xb6, 0xb7, 0xbe, 0xe2, 0xbe, 0xb1, 0xb2, 0xb2, 0xb6, 0xb6, |
得到flag flag{1fd5109e965511ee474e5dde4007a71f}
Ez_pycode_dis
字节码格式
常见的python字节码指令:
[mw_shl_code=applescript,false]
LOAD_CONST:加载常量,比如数值、字符串。用于传递给函数作为参数
BUILD_LIST: 创建一个列表
LOAD_FAST:用于读取值,用于计算或者函数调用传参等。
STORE_FAST:用于保存值到局部变量。
SETUP_LOOP 用于开始一个循环
BINARY_RSHIFT:用于右移(>>)
BINARY_LSHIFT:用于左移(<<)
BINARY_OR:用于位或(|)
BINARY_AND:用于位与(&)
BINARY_XOR: 用于异或[/mw_shl_code]
分析字节码得到源码
1 | keys1='welcome_to_qsnctf_u_will_have_a_good_time!' |
运行得到flag
人民的名义-抓捕赵德汉1-200
(8条消息) XCTF_MOBILE15_人民的名义-抓捕赵德汉1-200_大雄_RE的博客-CSDN博客
Super Mario Bros
根据图片可以猜到是一个Python的exe,反编译得到源码,然后做个简单异或即可
1 | enc = [10, 9, 23, 2, 23, 109, 15, 7, 4, 3, 58, 71, 22, 51, 82, 93, 20, 92, 93, 28, 41, 3, 25, 78, 0, 44, 16] |
flag{Mario_1s_r3a11y_funnY}
变形金刚
2019KCTF 晋级赛Q1 | 第二题点评及解题思路 (kanxue.com)
LiHua’s checkme
[LiHuas_checkme 1.txt](/image/CTF/青少年CTFReverse合集/LiHuas_checkme 1-20230331163951-4meqymk.txt)
1 | flag=[114433,114459,114449,114438,114452,114473,114480,114530,114531,114487,114528,114483,114531,114484,114559,114530,114539,114532,114486,114559,114534,114484,114486,114538,114559,114538,114484,114539,114535,114559,114533,114487,114529,114538,114538,114486,114532,114539,114534,114539,114531,114531,114479] |
GO_Re
[gore.zip](/image/CTF/青少年CTFReverse合集/gore 1-20230222094316-d0dwdmm.zip)
代码比较混乱,细看之后找到
加密函数,猜测 v1 为是输入的值
经过加密之后与 v11 进行比较
分析加密函数
调试得到 v27
1 | V27=[243,79,85,235,242,11,136,210,70,121,193,114,95,140,200,114,59,213,194,165,130,41,234,220,20,176,3,159,72,73,88,84] |
多次尝试之后发现需要两个字节一起两两交换输出 flag
脚本如下:
1 | v27=[243,79,85,235,242,11,136,210,70,121,193,114,95,140,200,114,59,213,194,165,130,41,234,220,20,176,3,159,72,73,88,84] |
babyUPX
查壳后发现是upx的壳,正常手动脱壳发现脱不掉,猜测可能是魔改壳。打开010进行手动恢复。
打开010后检查两个地方。
可以发现第一部分是没有问题的,UPX0,UPX1和UPX2都没有缺少,但是在下面的3.96._PX!就出现了字符缺失。(正常upx壳为3.96.UPX!)因此我们把缺少的字符补回去即可。修改后正常脱壳,直接拖入ida即可。
首先看到主函数:
1 | int main() |
加密逻辑比较简单,那么我们看看具体的加密函数。
1.task函数
1 | __int64 __cdecl task(__int64 a, __int64 b) |
【这个函数里的HIDWORD在c++中无法运用,在建立自定义函数的时候需要自行进行修改。其次就是函数的类型为**_int64**,这与int不同(int是32位的,如果类型错误会导致一部分字符的丢失】
那么我们对于task函数的自定义脚本就可以写为
1 | __int64 task(__int64 a, __int64 b) |
【一定要注意参数的类型必须对应】
这里用到的参数一个是str,是我们输入的字符串,一个是table,可以点击查看获取。【点击table我们会发现一个比较不同的表达,例如 2 dup (5),这就表示 2 个 5,我们可以通过导出的 initialized C variable形式进行对比查验。】
2.Task函数。这个函数我们点击会发现只有一个参数的异或操作,那么我们写脚本时直接写参数异或即可。
3.Check语句。
我们点击Check语句后得到如下:
1 | __int64 __cdecl check(__int64 A, __int64 l) |
这里的PAIR64我目前没有查到什么有用的信息,那么点击C数组查看一下,看到是一些比较长的16进制数,根据判断语句猜测可能就是加密后形成的flag。也就是说str经过两个函数加密处理后存入v1,如果v1和C一一对应,那么str就是我们需要的正确flag输出。
一般遇到需要逆向求输入的字符串时,可以考虑进行字符串爆破。
解密脚本如下:
1 | #include<iostream> |
粗心的小红
qsnctf{d52557e8-3a19-4b4a-9347-8badeb89f0e2}