2022ZJCTF

CTF

hhhh,我是懒惰虫😪

EzMath2

动调嗯调

直接放入 x32dbg 里动调

找到oep

image-20220924113702483

继续动调,进入main函数内部

image-20220924113848022

更改跳转,跳过反调试

image-20220924114033993

读取字符串之后进行比较

image-20220924114206681

在比较前将输入的字符串放入一个循环中,每轮依次读取2个字符进行加密

image-20220924122402648

对第一个字符和7异或后减1

image-20220924122543349

对第二个字符的加密,要利用循环爆破测试出值

image-20220924122054065

所要对比的值

image-20220924124307514

exp

image-20220924130522572

DASCTF{U_kn0w_M0du1e_rEv~}

去壳 & 花指令

魔改的 UPX 壳,UPX 段名字改为了 FUN 所以使用 upx -d 无法直接脱壳,将文件放入 010Editor 中其名字修改为 UPX 即可脱壳

image-20220928204350702

至于是怎么看出来的嘛,q神说 shellcode 或者查壳工具都能看出来。

将脱了壳的东西拖入 ida 中进行分析,对于函数 sub_4011B4 发现 f5 无法解析

image-20220928204529873

结合汇编语句发现,call 完 sub_4011B4 后在该函数中进行了一个 pop ebx 的操作,这个操作将 call 进来的地址进行了出栈,紧接着的这三个语句

image-20220928205719627

结合起来就相当于一个 jmp 目的地址就是 0x4011CE

image-20220928210440283

结合上面的 call 这一块其实堆栈是平衡的,因为上面的 call 和 pop 是一组,下面的 push 和 retn 是一组

image-20220928210854609

但问题就出在 call 上面,ida 将 call 了之后的东西当成了一个独立的函数也就是 sub_4011B4,单单对于这个函数而言由于多了个 pop ebx 导致栈空间的不平衡,所以 ida 对这个函数的分析就寄了

那么解决方法也就出来了,问题的关键在于这个 pop ebx,而这个 call 和 pop 又是正好实现栈平衡的一组,那么将 call 改成 jmp 然后把无用的 pop ebx 给 nop 掉,将下图中的三句改为一个 jmp

image-20220929205209392

最后修改完成的结果,然后对函数体重新进行识别,具体是将 sub_4011b4 取消,修改一下 sub_401140 的 end 位置

image-20220929205158134

去完花指令的东西就可以被 ida 精准识别了

image-20220929205521698

Android

非预期

flag 是以图片的形式呈现的,解压缩 apk 文件找出来就ok

正解

将apk放入,jadx中

image-20220924101634431

读取用户名和密码

image-20220924101743596

将用户名 user 和 mname = “ccadwjlyah” 进行比较。将输入的密码放入 change() 中改变后和设定的 compare 数组进行比较

image-20220924102031695

根据 change() 和 compare 推出密码

image-20220924102314820

但这个密码是缺失的,因为compare中有一个值未知,不知道这个是干嘛的,也不知道怎么得到这个值

后来查了一下这个值是 ItemTouchHelper 类里的一个常量,固定值是 200,那么解密解出来的东西应该就是对应的 1

image-20220924102410834

结合题目以及现有密码可以推测后面代表的应该是 android,猜测是

f4n_4ndroid 或者 f4n_4ndro1d,最后输入 f4n_4ndro1d 成功

image-20220924102604233

DASCTF{1df456_34hjfk_y3o5c_99gh34_3ndro1d}

本文作者:GhDemi

本文链接: https://ghdemi.github.io/2022/10/07/2022ZJCTF/

文章默认使用 CC BY-NC-SA 4.0 协议进行许可,使用时请注意遵守协议。