首页
社区
课程
招聘
[讨论]第三题思路
发表于: 2015-10-18 23:57 2779

[讨论]第三题思路

2015-10-18 23:57
2779
APK解包,dex没有保护,所有工作在so内部完成,ida加载so,失败
在机器上安装运行应用,之前有修改固件的vm/Jni.cpp文件,相关jni入口直接打印出来入口地址
I/dalvikvm( 8867): CrackU jni Lcom/ctf/crackme3/MainActivity; check 0x6549ec39
ida attach后加断点

进入后程序跳来跳去,担心jni入口只是保存输入字符并不处理,所以想在系统返回的字符串上做处理:还是修改vm/Jni.cpp,如果提交特定字符串,返回异常字符串
if(*newStr == 'x' && newStr[1] == 'x') return (char const*)0x12345678;
修改固件后,输入xx,在strlen函数中捕获到异常,调用堆栈在0x654e3576
初步跟踪该处代码发现一个字符串长度的循环,看起来像是在处理输入字符。
花了比较多时间动态跟踪,大致看到这部分代码只拷贝了一下输入字符。
中间尝试过暴力破解,写一个APK封装该so,发现调用时间太长,strace发现调用了nanosleep,修改固件屏蔽掉该调用,check一次还是需要将近1s,并且发现CPU占用率50%,双核的机器,也就是说check一下满CPU运行需要1s钟,用飞机座位编号的两个数字加一个大写字母破解了一遍,没有结果故放弃。
继续ida动态跟踪,初步发现里面有三个函数表,两个跳转函数,一个处理前面的三个函数表,一个处理分支,另外一个加密数据的函数。分别用来隐藏调用和数据,用ida脚本记录调用信息,在三个函数中设置断点自动记录调用过程,跑了一个晚上都没跑完。
修改脚本,只在特定步骤下断点,大致发现整个check过程有几个循环[从strlen返回后开始]
65494576 处,字符串长度的循环
654A0188 长度100次的循环
6549f844 超长的165596次循环
654a75ed 63次循环
6549a6cc 264次循环
循环的次数很固定,同输入字符串无关[空串除外]
dump关键节点的内存比较time up

看过提示发现自己还差太远:)
signal 用strace的时候有注意到
19:53:01 sigaction(SIGILL, {0x654870a5, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, NULL, 0) = 0  4005E000触发
19:53:01 sigaction(SIGSEGV, {0x654870a5, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, NULL, 0) = 0
19:53:01 sigaction(SIGTRAP, {0x654870a5, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, NULL, 0) = 0

另外整个过程so基地址 65485000

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

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