极客巅峰2022初赛-RE
CrackMe
0x0 前言
https://mp.weixin.qq.com/s/thAUBnPRLQ7ZCjwB1dH0yQ
比赛时就看了apk一题,可惜没做出来,现在复现一下当时就卡在了RC4上,看了wp才知道还有加一 ,但是wp中的异或某一个值有点感觉太运气了,如果是异或i这种不同的值应该就G了。
非常感谢有wp学习。也感谢Retard师傅的指点。
0x1 JAVA层
里面的字符串进行了StringFog的加密,onCreate先是获取了输入,然后起了一个新服务,进行了loadassets,然后就是关键函数CheckFlag,这里的两个加密字符串就是right 和 wrong 为什么我知道,我用真机调试然后在recv接受的地方跳过,判断成功然后输出字符串。然后通过安卓killer改变里面的字符串改成其他的输出,就知道了其他字符串的值
Checkflag加载了native,然后里面的字符串就是dragon,通过上面说的方法输出知道的
这里的字符串就是 chmod +x 和 sudo 两个提权把前面的服务和dragon提权
assets里就是dragon和一些假的png
0x2 分析So层
recvdata就是等待服务端发送值回来,然后进行对比,密文我们就得到了
0x3 分析dragon
可以发现1350里有一个rc4加密,当时我就是做到这里,不知道怎么动调这个RC4
这些异或出来的值就是上面rain1.png这些文件,在读取这5个png
然后在1E9C的位置生成了shellcode,mprotect是保护这段内存不被读取,pthread_create创建了,所以调试断这里把V18dump下来即可
在dragon中可以看见大小为1D000起始地址就动调dump的时候你自己当时的地址是多少都可以,选择32位ida arm架构,因为dragon是跑在真机里的
进来直接起始地址加0x1430,因为在dumpshellcode时可以发现写在了shellcode的0x1430,所以我们这里快速到关键位置
如果动调dump应该对这里熟悉直接转C
可以发现无法转过来,我这里用了个体力活就是把最后面的BX nop了,因为这就类似跳转混淆那种llvm
可以看到反编译出来很多
但是很多wp中的检测flag格式哪些就没有反编译出来
0x4 总结
剩下的可以在上面wp中看见,这里有个坑点,我原本想自己动调一遍然后把上面的剩下算法走一遍给大家看,然后截图下来写进去,我手机是root的,大家运行的时候可能会发现没有回馈回来,报wrong,就是因为权限不够,服务没有加载出来,就直接死住,然后等待不到recv的数据就死了。这个软件不会主动申请root权限,就有点难受,面具对主动申请的软件会给root权限。动调的话,应该可以attch上新起的服务和shellcode。大家如果会过混淆通过静态估计也可以做出来
EZRE
0x0 前言
感谢Retard师傅,非常非常感谢(一定找个机会线下gank他)。这题复现我一直在想连接socket发送值过去。老是连不上。
0x1 Ctrl+s
一般做题都会findcrypt一下看一下加密。或者直接查看data段,发现data段这里就很想sbox
通过索引就可以看到被加密过了
然后就可以索引到AES加密的位置
这时候就是AES汇编下方一片红,然后通过索引
就可以发现这里有一个955的循环,就是smc,循环 异或 i %256
然后就可以得到这个真正的关键函数,里面就是调用了16次AES加密,然后每次改变key和iv,可以直接通过改变RIP跳到这边,dump里面的iv和key
然后while出来再加密一次进行对比
可以自己给a1写一个空地址 在空地址自己patch一点输入进去
或者自己写一个同样加密,自己实现一遍
0x2 总结
感觉有点迷糊复现这题,老是想通过socket通过程序跑到真函数中。