本帖最后由 UNCLE 于 2016-3-1 18:18 编辑
ctf题目就不说了,不重要~~(原题在最后有下载) 使用jeb查看源码,发现对username和passwd进行部分验证后,再将将username+passwd及一个数据库查询结果作为Auth.auth()方法的参数,如果返回值为1则激活另外一个活动app 仔细查看类app的源码发现这个类对传入的passwd参数做了是否为空的校验,后面将密码传入jni中把passwd作为des解密密钥使用了,所以需要知道passwd是什么。 如下的数据库查询,是将key.db使用select * from key where id = 0语句查询,结果为zctf2016。(数据库为SQLite,可以工具打开key.db直接查看) 有趣的是源码中不但有加密函数,也有解密函数。所以带入文件内容和解密函数写一小段代码就能把密
码算出来。 byte[] bsrc = { (byte) 0xd3, 0x3a, (byte) 0x60, (byte) 0xc4, (byte) 0x74, (byte) 0xf1, (byte) 0x0a, (byte) 0x0a,(byte) 0x0d, (byte) 0x71, (byte) 0x64, (byte) 0x82, (byte) 0x57, (byte) 0x26, (byte) 0x68,(byte) 0xd1 };
byte[] bres = new byte[24];
try {
bres = decrypt(src, "zctf2016".getBytes());
} catch (Exception e) {
e.printStackTrace();
}
String s_res = new String(bres);
System.out.println(bres);
输出结果为”}sihttoN{ftcz”,记得字符串是被反向的,正确的应该为zctf{Notthis}。故用户名为zctf密码为{Notthis}
接着在app中有结束进程的代码 所以这里要修改代码 例如将!=0改成==0。 即,if-eqz改成if-nez(汇编代码和反编译代码逻辑有些许不同) 然后JNIclass的add貌似是一个检测是否为调试状态的函数,并不知道参数的1和2有什么用,反正我没有修改这里也没有任何问题。 最后调用了sayHelloInc()
在IDA中f5 查看源码,首先判断了是否为调试状态(later_Java_com_zctf_app_JNIclass_add 函数),如果不是就打开bottom 文件,读取并以{Notthis 为密码做des 解密。 然后马上释放掉存储解密内容和源文件的空间,最后返回。 需要在later_Java_com_zctf_app_JNIclass_add执行完后面下断点,调试时修改返回值 在这里停下来之后修改r0的值 并且在free前面停下来, 在f5反编译出的代码中可以看出v15为bottom文件内容,v23存放解密后的内容,即R5和R7,找到R7所指向的,并在hex view下选定范围并另存为png文件。 最后用stegsolve打开图片发现flag。 这个写得比较粗略,如果有疑问的敬请提出,虽然知道的不多但是我会尽量回复的。
链接: http://pan.baidu.com/s/1i4v3DoL 密码: xsq5
|