好友
阅读权限 20
听众
最后登录 1970-1-1
本帖最后由 shavchen 于 2019-4-10 22:09 编辑
题目下载
下载链接
https://pan.baidu.com/s/1vIU3YKmXo0fnBm4rSciT8g
密码: i1py
题目分析
在安卓模拟器上运行程序
程序流程
提示信息
Time remaining(s):200000
AliCTF{}
初步分析
应该是200000秒之后才会出现flag
下一步使用安卓调试神器jeb进一步分析
JEB分析
JEB介绍
JEB:IDA+111=JEB,JEB相当于Windows平台上的IDA
smali代码:双击Bytecode,出现smali代码;相较于C之汇编,则smali之于Java
smali语法参考文章
快捷键:按q
切换到java伪代码
进入android程序入口类
进入方式
Bytecode/Hierarchy-net-tomorrow-MainActivity
> 双击左边的Bytecode默认进入的就是此入口类
按 Q
查看java伪代码
查看onCreate函数
> 一个activity启动回调的第一个函数就是onCreate,这个函数主要做这个activity启动的一些必要的初始化的工作。
>
> onCreate之后调用了还有onRestart()和onStart()等。
查看onCreate回调的MainActivity函数
public MainActivity() {
super();
this.beg = (((int)>(System.currentTimeMillis() / 1000))) + 200000;
//当前时间(beg)为200000加上当前时间(s)
this.k = 0;
//k初始化为0,和onCreate函数中的flag字符串存在联系
this.t = 0;
}
查看onCreate回调的is2函数
编写脚本
由于md渲染问题,代码放于文末
运行结果
k=1616384
Android Killer修改并打包源程序
进入入口类
搜索字符串 AliCTF
定位到变量 k
搜索stringFromJNI2
上一条句把k存放在寄存器v3
中,下面修改v3,就可以修改k
寄存器用v开头数字结尾的符号来表示,如v0、v1、v2、...
修改变量k的值
const v3;1616384
理一理思路
这里我把k
的值设置为正确的值,即执行200000次后会出现的值了
但是因为if条件判断为假,程序还是会执行200000次,才会输出flag
这里就需要把<=
改为>
搜索<=
附近的字符串AliCTF
修改if判断条件
发现这里是反过来的,下一步把 >
改成 <=
将if-gtz v0, :cond_0
修改为if-lez v0, :cond_0
编译打包程序
在编译的时候遇到以下问题
>>Project\res\values-v23\styles.xml:6: error: Error retrieving parent for item: No resource found that matches the given name '@android:style/WindowTitleBackground'.
>>
>>Project\res\values-v23\styles.xml:6: error: Error retrieving parent for item: No resource found that matches the given name '@android:style/WindowTitleBackground'.
解决方法
找到res/value-v23/styles.xml,把resources下的东西注释掉
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--
...
-->
</resources>
> 找到res/value/public.xml,把所有带Base.V23的东西(两个)注释掉
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--
...
-->
</resources>
重新编译打包
模拟器载入新安装包
总结
环境问题
Android Killer编译apk始终失败
通过换jdk7以及修改res/xml成功编译
运行Jeb闪退
修改jeb_winos.bat,替换java版本
技术问题
不懂smati语言,但是Jeb和AK自身的伪代码转义功能较强,还是可以看懂程序流程
下来需要潜心学习smati语法
本例程序代码量很少,遇到大型程序不会这么简单
代码部分
#include <iostream>
using namespace std;
bool is2(int arg4)
{
bool v1 = true;
if(arg4 > 3)
{
if(arg4 % 2 != 0 && arg4 % 3 != 0)
{
int v0 = 5;
while(true)
{
if(v0 * v0 <= arg4)
{
if(arg4 % v0 != 0 && arg4 % (v0 + 2) != 0)
{
v0 += 6;
continue;
}
return false;
}
else
return v1;
}
return false;
}
v1 = false;
}
else if(arg4 <= 1)
v1 = false;
return v1;
}
int main()
{
int time = 200000;
int k = 0;
while(time > 0)
{
if(is2(time))
k+=100;
else
k--;
time--;
}
cout << "k=" << k << endl ;
return 0;
}
免费评分
参与人数 1 威望 +1
吾爱币 +7
热心值 +1
收起
理由
Hmily
+ 1
+ 7
+ 1
感谢发布原创作品,吾爱破解论坛因你更精彩!
查看全部评分
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。