-
-
[原创]第二题AliCrackme2,12字节修改让so输出密码
-
发表于: 2015-1-25 16:46 2748
-
第二题难度陡增,开始进入误区学用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的参数:
.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字节如下:
#!/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,如果想程序继续跑下去,需要换其他寄存器):
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的偏移)
.text:00001308 off_1308 DCD 0x2D0 ; off_628C - 0x5FBC
用工具修改so的对应位置后,丢到IDA中验证,确保修改成功:
替换修改后的so后,原来_android_log_print位置输出的就是本题密码:
吐槽下解密出来的结果居然是这个...
附件中为修改好的so文件
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
看原图
赞赏
雪币:
留言: