谁有空来逆个ipa,百度杯第二场

crack me3.ipa (390.2 KB)

没有个简单的介绍,来龙去脉之类的东西吗?

没有 今天刚放出的tip:DES和凯撒加密

里面有三个C函数很有意思…

AAA:BBB函数中使用CCCrypt函数对输入的文本进行DES加密结果转base,但是我不是很明白,sub_8688是干啥的,转了一圈 sub_8658验证之后就直接弹出验证失败了。

大概reveal是凯撒加密流程,调了一下 我主要关注的是sub_8657 ,流程还不是很明白。。。

8688 也太大了,,IDA加了几次才显示Graph。
可能我这个IOS版本低一些(7.1.2),装不了IPA
简单静态看一下,也就只能看出比较短的这几个函数,ECB模式的DES。
不知道那个8688怎么参与运算逻辑的,看有没有解析了。
等着公司换设备啊。

一堆花指令。:joy:
密码是IUOias8 要多点几次验证几次才能过。

在哪参加的啊?

ichunqiu

能说说思路吗

ollvm 在elf pe上可以用 静态分析+符号执行,可惜没有mach-o加载器,只能人肉逆:joy:

不是很明白…

iOS上就是老方法 lldb + ida

是一种对抗IR混淆的方案。我这还有对抗对抗IR混淆的Paper【我没多打字就是这么绕】

来一份阅读一下好不咯~:kissing:

2333你跑到这里来问题目,我在后台取消你的成绩了:new_moon_with_face:

2 个赞

膜膜膜膜膜膜

__text:000000010001AE6C MOV W0, #0x1A
__text:000000010001AE70 LDUR X1, [X29,#-0xE0]
__text:000000010001AE74 LDR X2, [X1]
__text:000000010001AE78 LDRSB W3, [X2]
__text:000000010001AE7C SUB W3, W3, #0x41 ; ~~
__text:000000010001AE80 ADD W3, W3, #5
__text:000000010001AE84 MOV W4, #0x1A
__text:000000010001AE88 SDIV W5, W3, W0
__text:000000010001AE8C MSUB W0, W5, W0, W3
__text:000000010001AE90 ADD W0, W0, #0x41
__text:000000010001AE94 LDUR X2, [X29,#-0xF0]
__text:000000010001AE98 LDR X6, [X2]
__text:000000010001AE9C STRB W0, [X6] ; to addr


__text:00000001000282AC MOV W0, #0x1A
__text:00000001000282B0 LDUR X1, [X29,#-0xE0]
__text:00000001000282B4 LDR X2, [X1]
__text:00000001000282B8 LDRSB W3, [X2]
__text:00000001000282BC SUB W3, W3, #0x61 ; ~~
__text:00000001000282C0 ADD W3, W3, #5
__text:00000001000282C4 MOV W4, #0x1A
__text:00000001000282C8 SDIV W5, W3, W0
__text:00000001000282CC MSUB W0, W5, W0, W3
__text:00000001000282D0 ADD W0, W0, #0x61
__text:00000001000282D4 LDUR X2, [X29,#-0xF0]
__text:00000001000282D8 LDR X6, [X2]
__text:00000001000282DC STRB W0, [X6] ; to addr


__text:000000010003E3DC ADRP X0, #aWmnlwixufgl@PAGE ; “wMnLwixufgl=”
__text:000000010003E3E0 ADD X0, X0, #aWmnlwixufgl@PAGEOFF ; “wMnLwixufgl=”
__text:000000010003E3E4 LDUR X1, [X29,#-0xF0]
__text:000000010003E3E8 LDR X2, [X1]
__text:000000010003E3EC STRB WZR, [X2]
__text:000000010003E3F0 LDUR X2, [X29,#-0xD0]
__text:000000010003E3F4 STR X0, [X2]
__text:000000010003E3F8 LDR X0, [X2]
__text:000000010003E3FC LDUR X3, [X29,#-0xE8]
__text:000000010003E400 LDR X1, [X3]
__text:000000010003E404 SUB X19, X29, #0xF18
__text:000000010003E408 STUR X8, [X19,#-0x100]
__text:000000010003E40C SUB X19, X29, #0xF20
__text:000000010003E410 STUR X9, [X19,#-0x100]
__text:000000010003E414 SUB X19, X29, #0xF28
__text:000000010003E418 STUR X10, [X19,#-0x100]
__text:000000010003E41C SUB X19, X29, #0xF30
__text:000000010003E420 STUR X11, [X19,#-0x100]
__text:000000010003E424 SUB X19, X29, #0xF38
__text:000000010003E428 STUR X12, [X19,#-0x100]
__text:000000010003E42C SUB X19, X29, #0xF40
__text:000000010003E430 STUR X13, [X19,#-0x100]
__text:000000010003E434 SUB X19, X29, #0xF48
__text:000000010003E438 STUR X14, [X19,#-0x100]
__text:000000010003E43C SUB X19, X29, #0xF50
__text:000000010003E440 STUR X15, [X19,#-0x100]
__text:000000010003E444 SUB X19, X29, #0xF58
__text:000000010003E448 STUR X16, [X19,#-0x100]
__text:000000010003E44C SUB X19, X29, #0xF60
__text:000000010003E450 STUR X17, [X19,#-0x100]
__text:000000010003E454 BL _strcmp ; ~~~


最终和wMnLwixufgl=比较
可以反推推出
rHiGrdspabg=

CCCryptorStatus CCCrypt(
CCOperation op, // operation: kCCEncrypt or kCCDecrypt
CCAlgorithm alg, // algorithm: kCCAlgorithmAES128…
CCOptions options, // operation: kCCOptionPKCS7Padding…
const void *key, // key
size_t keyLength, // key length
const void *iv, // initialization vector (optional)
const void *dataIn, // input data
size_t dataInLength, // input data length
void *dataOut, // output data buffer
size_t dataOutAvailable, // output data length available
size_t *dataOutMoved) // real output data length generated

枚举类型数据通过头文件
https://opensource.apple.com/source/CommonCrypto/CommonCrypto-36064/CommonCrypto/CommonCryptor.h

enum {
kCCEncrypt = 0,
kCCDecrypt,
};

enum {
kCCAlgorithmAES128 = 0,
kCCAlgorithmDES,
kCCAlgorithm3DES,
kCCAlgorithmCAST,
kCCAlgorithmRC4,
kCCAlgorithmRC2
};

enum {
/* options for block ciphers /
kCCOptionPKCS7Padding = 0x0001,
kCCOptionECBMode = 0x0002
/
stream ciphers currently have no options */
};

reg r x0 x1 x2 x3
x0 = 0x0000000000000000 → kCCEncrypt
x1 = 0x0000000000000001 → kCCAlgorithmDES
x2 = 0x0000000000000003 → kCCOptionPKCS7Padding | kCCOptionECBMode
x3 = 0x000000012cd14da8 → key
reg r x4 x5 x6 x7
x4 = 0x0000000000000008 → key length
x5 = 0x0000000000000000 → initialization vector (optional)
x6 = 0x000000012cebe460 → input data
x7 = 0x0000000000000006 → input data length

key = ‘UTF-8’ + ‘\x00’*3
解密后数据是
‘IUOias8\x01’

但是我在调试过程中key的最后3位并不是00 00 00,不知道是什么问题。

如果密钥不足16位在cccrypt里也是按 \0 来补齐吧。

:grinning: