前言:
第一次写这么正式的writeup,本身也不爱写啥文档,就写成日记一样吧。
去年参加过第一届,那时只有安卓战区,虽准时参加,但人才涌动,每做完一题前面都几十号人做完了,这次难得开了IOS区,怀着娱乐娱乐的心态,8点钟准时坐在电脑前。
第一题:
1.初分析:
安装好后,出现的是简单的密码确认界面,和去年的安卓题很像,直接抄家伙。
2.反编译:
从AliCrackme_1.ipa中解压出执行程序level1(右键选择打开方式WinRAR打开,或者改后缀名成zip),用IDA打开,注意入口选择的时候选择Fat结构的ARMv7,比较容易反编译,等待分析完,点击左边的名称排序,IDA会把类名和方法解析出来,那明显就是ViewController类了,也不难发现,点击按钮的方法是onClick,使用tab建(或F5)反编译。
3.分析:
反编译的结果差不多就是源码了(感慨下万能的IDA让我们节约了多少时间),可以得知v2是一长串密文,采用Ceasar Cipher(凯撒加密)和AES组合解密5次(v3)得到明文,再与我们输入的字符进行逐字对比,下面的代码是从2个NSString(明文和输入)转换char*(使用UTF8String方法),然后循环对比,根据结果决定UIAlertView显示的文字。
说了这么多其实关键就是那个解密算法的还原
4.碰:
找了一下,找不到现成的在线算法和简易的python库(凯撒加密),突然想:既然开发这个crackme,就去网上找objc版本的吧。遂找到:
https://github.com/RyanBibby/Caesar-Cipher-iPhone-App
https://github.com/Gurpartap/AESCrypt-ObjC
5.拼:
用打开Ceasar Cipher.xcodeproj工程,加入AESCrypt-Objc的相关文件(注意修改工程的编译器设置,默认他是gcc,目标平台版本),把反编译的代码润色了一下。
运行直接出结果。
第二题:
1.初分析:
拿到题目后,第一感觉就是题目的描述比较晦涩,再而就是这难度跨度有点大,让刚做完第一题的我瞬间兴奋全无,先介绍几个关键字。
kernelcache:
这个其实是从ipsw(系统固件)里解压出的文件,再经过解密而成的,感谢出题组没有让我再解密一次,实质上是macho结构的编译内核。
kaslr:内核的随机地址布局,类似于普通程序的aslr,其实如果用IDA分析本文件,地址是使用正常偏移(不带随机),不用在意这个“减去”
/dev/random:随机数生成器
/dev/pf:包过滤设备
/dev/ptmx:伪终端服务器
上面三个结构都是XNU的字符设备,需要一个描述结构cdevsw:
struct cdevsw {
open_close_fcn_t *d_open;
open_close_fcn_t *d_close;
read_write_fcn_t *d_read;
read_write_fcn_t *d_write;
ioctl_fcn_t *d_ioctl;
stop_fcn_t *d_stop;
reset_fcn_t *d_reset;
struct tty **d_ttys;
select_fcn_t *d_select;
mmap_fcn_t *d_mmap;
strategy_fcn_t *d_strategy;
getc_fcn_t *d_getc;
putc_fcn_t *d_putc;
int d_type;
};
2.反编译:
用IDA打开kernelcache,既然题目要我们找cdevsw结构,那么我就先找把cdevsw结构注册到devsw表的cdevsw_add函数,打开Exports视图,找到_cdevsw_add。
双击定位到反汇编面板,函数名按x键查看引用。
从引用地址名和位置关系不难看出,只有前五个引用是内核中的,其他的都是kext驱动中的,所以我们只要分析前五个,找到我们题目要求的字符设备就行了。接下来双击第一个引用地址,按下tab键(或f5)反编译。
bingo!命中题目要求的random设备,接下来双击他的cdevsw结构(黄色标注的cdevsw_add的第二个参数)。
这个结构题比较简单,基本都是存着指针(32位4字节一个成员),所以不用去在IDA中添加自定义结构体了,d_read, d_write, d_ioctl,分别对应结构体的第3,4,5个成员(红框标注),不难得到第一组数据。
0x800c0ea1#0x800c0e39#0x800c0e05
(强烈鄙视出题组,没有注明“
小写”!!!!!!!!!,让我白白浪费20多分钟)
照此法不难找出pf设备的数据(第三个引用):0x802873ad#0x802873ad#0x80149d19
3.碰:
当点击第四个引用的时候(和第五个引用是同一函数),通过上下文发现这个函数是注册ptmx设备相关的,但cdevsw_add有2个,到底是哪个呢,其实可以每个都去提交一次尝试(我就这么做了,但是被“小写”搞死了),为了撩去心中的疑惑,我去苹果开源找到此设备相关代码
http://www.opensource.apple.com/source/xnu/xnu-2782.40.9/bsd/kern/tty_ptmx.c
这回肯定第一个就是了。这个时候我才想起“小写”的可能性,都快在放弃的边缘了。
最终得到答案:
0x800c0ea1#0x800c0e39#0x800c0e05#0x802873ad#0x802873ad#0x80149d19#0x80292251#0x80292661#0x8029298d
第三题:
1.随便说说:
很遗憾没有做出来,在上一届安卓的第四还是第五题也是这种,混淆花指令,考验人的耐心最佳武器。
2.前奏:
crackme打开后,发现和第一题差不多,用IDA打开也差不多,马上点击[ViewController onClick],进入后发现关键判断函数1DCB8,点击进入,这个时候IDA的反编译就失效了,进入反汇编窗口。
3.困惑:
到这里想到一些东西,之前在桌面平台反花时候,可以写ollydbg脚本总结当前指令的规律,自动单步写log,ios我没有这么强的联调工具。。我想把反汇编的结果先写成asm,在MDK中跑通,然后在MDK跑脚本去花(不知道可行么),但因为各种事情没有坚持下去。。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)