首页
社区
课程
招聘
[原创]第二题AliCrackme2,12字节修改让so输出密码
发表于: 2015-1-25 16:46 2748

[原创]第二题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的参数:
.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期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//