-
-
[原创]第二题AliCrackme2,12字节修改让so输出密码
-
发表于: 2015-1-25 16:46 2818
-
第二题难度陡增,开始进入误区学用IDA调试so文件,结果有反调试app闪退...
(求解过反调试方法)
第二题验证是在JNI的 Java_com_yaotong_crackme_MainActivity_securityCheck 函数里,看上去密码就是那个「wojiushidaan」,不过实际上JNI_OnLoad里做了手脚,而且加了反调试。
绕了几圈后又看回验证过程,发现securityCheck是与解密后的字符串直接比较,于是有了利用前面那个_android_log_print直接输出密码的猥琐想法,这样就不用管反调试和解密了。
直接看_android_log_print的参数:
0x1270-0x1274是将GLOBAL_OFFSET_TABLE地址写入R0,因为取密码所在的off_628C也会用到,这两句不能动。
0x1280是参数1的ANDROID_LOG_INFO,那么总共有12字节可以修改。这里要做的就是将R1/R2的内容,替换成密码对应的off_628c内容。不知道IDA怎么直接写ARM,只好拿出capstone来反向验证字节码,最终调整的12字节如下:
输出符合想要的效果(注意这里修改了R6,如果想程序继续跑下去,需要换其他寄存器):
这里 LDR R6,[PC,#8C] 是取PC向下偏移0x8C的4字节,也就是off_1308对应的0x2D0(这是密码off_628c相对GLOBAL_OFFSET_TABLE的偏移)
用工具修改so的对应位置后,丢到IDA中验证,确保修改成功:

替换修改后的so后,原来_android_log_print位置输出的就是本题密码:

吐槽下解密出来的结果居然是这个...
附件中为修改好的so文件

第二题验证是在JNI的 Java_com_yaotong_crackme_MainActivity_securityCheck 函数里,看上去密码就是那个「wojiushidaan」,不过实际上JNI_OnLoad里做了手脚,而且加了反调试。
绕了几圈后又看回验证过程,发现securityCheck是与解密后的字符串直接比较,于是有了利用前面那个_android_log_print直接输出密码的猥琐想法,这样就不用管反调试和解密了。
直接看_android_log_print的参数:
1 2 3 4 5 6 7 | .text:0000126C LDR R0, =(_GLOBAL_OFFSET_TABLE_ - 0x1278) .text:00001270 ADD R7, PC, R0 ; _GLOBAL_OFFSET_TABLE_ .text:00001274 ADD R0, R6, R7 .text:00001278 ADD R1, R0, #0x74 .text:0000127C ADD R2, R0, #0xDC .text:00001280 MOV R0, #4 .text:00001284 BL __android_log_print |
0x1270-0x1274是将GLOBAL_OFFSET_TABLE地址写入R0,因为取密码所在的off_628C也会用到,这两句不能动。
0x1280是参数1的ANDROID_LOG_INFO,那么总共有12字节可以修改。这里要做的就是将R1/R2的内容,替换成密码对应的off_628c内容。不知道IDA怎么直接写ARM,只好拿出capstone来反向验证字节码,最终调整的12字节如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/usr/bin/env python from capstone import * from capstone.arm import * def main(): md = Cs(CS_ARCH_ARM, CS_MODE_ARM) CODE = "\x8C\x60\x9F\xE5" "\x07\x10\x96\xE7" "\x07\x20\x96\xE7" ADDR = 0x1274 for i in md.disasm(CODE, ADDR): print "0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str) if __name__ == '__main__' : main() |
输出符合想要的效果(注意这里修改了R6,如果想程序继续跑下去,需要换其他寄存器):
1 2 3 | 0x1274: ldr r6, [pc, #0x8c] 0x1278: ldr r1, [r6, r7] 0x127c: ldr r2, [r6, r7] |
这里 LDR R6,[PC,#8C] 是取PC向下偏移0x8C的4字节,也就是off_1308对应的0x2D0(这是密码off_628c相对GLOBAL_OFFSET_TABLE的偏移)
1 | .text:00001308 off_1308 DCD 0x2D0 ; off_628C - 0x5FBC |
用工具修改so的对应位置后,丢到IDA中验证,确保修改成功:

替换修改后的so后,原来_android_log_print位置输出的就是本题密码:

吐槽下解密出来的结果居然是这个...
附件中为修改好的so文件
赞赏
他的文章
赞赏
雪币:
留言: