2024ISCC
要么0解,要么千解,6
Reverse
迷失之门
思路
查壳发现有个奇怪的玩意
但是进入IDA后发现并不影响,输入传进check后判断
然后进行处理后再通过check_2
进行判断
因此我们可以根据逻辑直接通过脚本爆破
exp
1 |
|
CrypticConundrum
解题思路
查壳发现UPX
使用upx.exe -d Cryptic.exe
脱壳后打开,得到主要逻辑
可以发现输入会先进入mix
,再进入Encryption
。但观察mix函数内部即可发现,其内部操作在输入长度为26时前后完全抵消。通过动态调试也可以验证
进入Encryption
后以及再进入的NewEncryption
就是一些基本的操作逻辑了,这里不再过多叙述,根据操作逻辑还原就行
exp
1 |
|
Badcode
解题思路
拖入IDA后可以留意到在输入flag后有一段神奇的检测,不影响后面程序运行,跳过
然后到下面对输入的奇偶数索引的字符分别进行一个变换。
紧接着就有一个函数,通过srand
设置种子生成24个随机数与处理过的flag异或,在这里可以通过动调直接dump出来
然后再往下看我们可以发现有个Tea加密(此处函数已重命名)
循环次数在Tea
里面通过计算得到。至此加密处理的逻辑理清
exp
1 |
|
DLLCode
解题思路
通过动态调试可知,输入首先通过索引的奇偶分成两部分进行存储。索引为偶数的部分被送入DLL中的Encode
函数进行加密。通过对相应dll进行逆向可以发现关键代码
此处为对输入与"ISCC"进行异或并返回
然后索引为奇数的部分被送入sub_B314D0
进行处理,追踪该函数可发现仅为字符顺序调换。然后下面的函数对上面奇偶两部分前后拼接在一起,最后进行对比判断
exp
1 |
|
mobile
Puzzle_Game
解题思路
拖进Jadx观察函数逻辑,发现在MainActivity中首先通过Jformat
函数校验flag格式开头ISCC{
和结尾}
,然后将中间部分送入a.a
作进一步校验
在a
中首先将传入内容分为两部分。前半部分要通过b
函数的检验,而后半部分则要与whathappened
库中getstr
的返回值一致。然后两部分加起来的sha256要等于437414687cecdd3526281d4bc6492f3931574036943597fddd40adfbe07a9afa
先看前半部分。在进入b
函数后,首先通过c
函数要求输入字符串为8位长度,然后转换为整型通过get1
函数和d
函数的检验。get1
函数要求数字开头为4,d
函数要求数字为质数。然后在该数基础上+11得到一个新数,不满足get1
函数和d
函数的条件。由此我们筛到的数有[49999991, 4999999, 49991, 49993, 49999, 4993, 4999, 491, 499]
再看后半部分。这里可以通过IDA逆向库文件或动态调试获取str2
得到,我选择动调。首先给apk开启调试权限
然后在Jadx对应函数位置下个断点
手机安装应用后在Jadx中启动并附加,运行到断点处,逐步运行直到得到参数
此时再结合sha256的结果,可得flagISCC{04999999gwC9nOCNUhsHqZm}
,直接提交显示错误。留意到提示文字OH YES, ONE STEP AWAY FROM SUCCESS!
,发现还有一个Receiver
的类还没有用到。里面要求通过广播传入参数并通过sha256进行校验,对应传入参数就是前面解出来的两部分
在AndroidManifest.xml
中找到活动为com.example.FINALFLAG
,尝试通过adb发送广播adb shell am broadcast -a com.example.FINALFLAG --es EXTRA_PART1 04999999 --es EXTRA_PART2 gwC9nOCNUhsHqZm
,无果
于是直接提取函数写成Java脚本
exp
1 |
|
得到后再套上flag格式即可ISCC{zhvOC88Er1m/C8xcyF2OIqwNvwCPUosg}
火眼金睛
解题思路
观察发现会传入一个参数到库函数getflag
里面
阅读getflag
的反编译代码
即可得到知道flag:999dtJFkgiuTWcFBdgeGh
,套上格式得到ISCC{999dtJFkgiuTWcFBdgeGh}