-
-
[原创][原创]iOS writeup
-
发表于: 2015-10-18 22:12 2847
-
在看《iOS逆向》学习的时候逛到看雪,刚好看到有比赛就来玩玩,距离上次登录快一年了。时间过得真快啊。
第一题
拖进Hopper,一眼看到[ViewController onClick]。
函数很简单,一共解密5次。先经过[Ceasar_CipherModel decrypt],再与密钥AES。
本来打算hook Ceasar_CipherModel的,结果发现堆上保留有对象。直接拿来用了。
得到结果Sp4rkDr0idKit。我并不知道diaoda_jiankang是什么意思。。
第一题 完!
第二题
刚开始连内核里面会有什么东西都不知道。。。
只好搜了一下cdevsw+ random, 居然发现了Apple公开的源码,虽然版本不一样,但差别不会很多。
源码
http://www.opensource.apple.com/source/xnu/xnu-2782.40.9/bsd/dev/random/randomdev.c
可以看到random_init有对cdevsw的引用。
直接定位字符串,找到
cdevsw结构体在0x803bd360 + 0xb14 = 0x803bde74
参考cdevsw定义得到
read: 0x800c0ea1
write: 0x800c0e39
ioctl: 0x800c0e05
同理,/dev/pf 在 0x803bd360 + 0xbbc = 0x803bdf1c
read: 0x802873ad
write: 0x802873ad
ioctl: 0x80149d19
开始有点怀疑,read和write是一样的,看了源码发现都是enodev。
第三个在 0x803bd360 + 0xc2c = 0x803bdf8c
read: 0x80292251
write: 0x80292661
ioctl: 0x8029298d
综上,0x800c0ea1#0x800c0e39#0x800c0e05#0x802873ad#0x802873ad#0x80149d19#0x80292251#0x80292661#0x8029298d
第二题 完!
第三题看到头都晕了,终于看懂是怎么执行的了,但还是找不到地方。
最后还是没人做出来,应该挺难的吧。
这两天学习到很多东西,看懂了arm汇编,lldb, hopper,各种逆向工具都上手了。是一次很好的练手机会。
希望这类比赛多点举办,现在移动安全越来越重要了。
第一题
拖进Hopper,一眼看到[ViewController onClick]。
函数很简单,一共解密5次。先经过[Ceasar_CipherModel decrypt],再与密钥AES。
r10 = @selector(initWithCipherKey:); r6 = @"mrMZAbjtZozDOGI9UeeH6g0iLHNnTNsFyzS0tYca4R3KkaQ0doxdDVuxZ7HoqYOcxFhgDiEvdGKix95VJNEUP8rdox4cm7GHVkbVcTJPmrTtH7hompW+xjTgGg2zQhs0tUGQ8lCggev2SNoWcaUOUU=="; r4 = @selector(alloc); r11 = 0x5; var_24 = @selector(decrypt); do { r0 = objc_msgSend(@class(Ceasar_CipherModel), r4); r11 = r11 - 0x1; r2 = r11; r0 = objc_msgSend(r0, r10); r5 = r0; r2 = r6; r0 = objc_msgSend(r0, r8); r0 = objc_msgSend(r5, var_24); r2 = objc_msgSend(r5, var_20); r3 = @"ZGlhb2RhX2ppYW5rYW5nCg=="; r6 = objc_msgSend(@class(AESCrypt), var_1C); } while (r11 > 0x0);
本来打算hook Ceasar_CipherModel的,结果发现堆上保留有对象。直接拿来用了。
得到结果Sp4rkDr0idKit。我并不知道diaoda_jiankang是什么意思。。
第一题 完!
第二题
刚开始连内核里面会有什么东西都不知道。。。
只好搜了一下cdevsw+ random, 居然发现了Apple公开的源码,虽然版本不一样,但差别不会很多。
源码
http://www.opensource.apple.com/source/xnu/xnu-2782.40.9/bsd/dev/random/randomdev.c
可以看到random_init有对cdevsw的引用。
void random_init(void) { int ret; ret = cdevsw_add(RANDOM_MAJOR, &random_cdevsw); if (ret < 0) { panic("random_init: failed to allocate a major number!"); }
直接定位字符串,找到
cdevsw结构体在0x803bd360 + 0xb14 = 0x803bde74
参考cdevsw定义得到
read: 0x800c0ea1
write: 0x800c0e39
ioctl: 0x800c0e05
同理,/dev/pf 在 0x803bd360 + 0xbbc = 0x803bdf1c
read: 0x802873ad
write: 0x802873ad
ioctl: 0x80149d19
开始有点怀疑,read和write是一样的,看了源码发现都是enodev。
第三个在 0x803bd360 + 0xc2c = 0x803bdf8c
read: 0x80292251
write: 0x80292661
ioctl: 0x8029298d
综上,0x800c0ea1#0x800c0e39#0x800c0e05#0x802873ad#0x802873ad#0x80149d19#0x80292251#0x80292661#0x8029298d
第二题 完!
第三题看到头都晕了,终于看懂是怎么执行的了,但还是找不到地方。
最后还是没人做出来,应该挺难的吧。
这两天学习到很多东西,看懂了arm汇编,lldb, hopper,各种逆向工具都上手了。是一次很好的练手机会。
希望这类比赛多点举办,现在移动安全越来越重要了。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
看原图
赞赏
雪币:
留言: