逆向分析课程小作业:
逆向分析对象:看雪CTF 2018年某题
看看它是干啥的
1、安装模拟器。
由于Android的apk文件不能直接安装在电脑上,所以先下载一个模拟器,例如夜某模拟器。打开之后安装apk文件。
2、简单测试一下
尝试用工具分析一下
1、使用AndroidKiller工具
(评价:网上下载了一圈的AndroidKiller效果都不是很好,本喵经过魔幻的操作得到了尚可的效果,建议用老师的版本试一下)
推荐一个免费下载逆向工具的靠谱网址。(https://down.52pojie.cn/Tools/Android_Tools/)
? 1)下载AndroidKiller
直接用这个版本的AndroidKiller打开apk文件会得到反汇编失败的结果。
? 2)下载Apktool
? 无需解压,替换AndroidKiller/bin/apktool/apktool目录下ShakaApktool.jar文件,并修改为相同的名字;再次尝试反汇编,可以得到理想的效果。
? 3)反编译效果展示
? 需要重点关注的是res/values/目录下的文件是否齐全。
? AndroidKiller的功能:它能帮助我们快速找到程序的入口(简直就是废物)
2、使用JEB工具
(评价:牛的,用它比用AndroidKiller强太多了,又快又能反汇编;也比GDA强,反汇编效果比GDA的质量好)
? 1)反汇编得到源代码
? 2)根据提示信息获取目标
? 反汇编代码:
? Public.xml文件
? string.xml文件
? 首先根据输入错误的提示信息failed!!!,在string.xml文件中找到字符串的name,在public文件中找到字符串对应的id,在源代码中理解代码含义。
? 3)源代码分析并复现
? 暴力代码(不建议参考,自己写一份):
#include<iostream>
#include<cstdio>
using namespace std;
int year;
int month;
int date ;
int Normal_year = 1;
int Normal_month = 1;
int Normal_date = 1;
int Cyear;
int Cmonth;
int Cdate;
int aTable[12] = { 16,6,7,10,9,16,10,8,8,9,6,6 };
int bTable[30] = { 5,10,8,15,16,15,8,16,8,16,9,17,8,17,10,8,9,18,5,15,10,9,8,9,15,18,7,8,16,6};
int cTable[12] = { 6,7,18,9,5,16,9,15,18,8,9,5 };
int dTable[60] = { 7,7,9,12,8,7,13,5,14,5,9,17,5,7,12,8,8,6,19,6,8,16,10,6,12,9,6,7,12,5,9,8,7,8,15,9,16,8,8,19,12,6,8,7,5,15,6,16,15,7,9,12,10,7,15,6,5,14,14,9 };
void DataNormalize();
void DataChange();
int main() {
int ans = 0;
int num = 0;
for (year = 1984; year <=2007; year++) {
month = 1;
for (; month <= 12; month++) {
date = 1;
for (; date <= 30; date++) {
ans = 0;
DataNormalize();
if (Normal_year != 0 && Normal_month != 0 && Normal_date != 0) {
Cyear = year;
Cmonth = month;
Cdate = date;
DataChange();
ans += dTable[(Cyear - 1900)% 60];
ans += cTable[Cmonth - 1];
ans += bTable[Cdate - 1];
int rep;
rep = ans;
for (int i = 0; i < 12; i++) {
rep += aTable[i];
if (rep == 34) {
if (month == 2 && i == 6) {
rep = ans;
break;
}
printf("success!!!");
cout << year << " " << month << " " << date << " " << i << endl;
num++;
rep = ans;
}
rep = ans;
}
}
else {
continue;
}
}
}
}
cout << endl;
cout << num << endl;
}
void DataNormalize(){
if (year > 0 && year < 189) {
Normal_year = 0;
}
if (year <= 1983 || year >= 2007) {
Normal_year = 0;
}
if (month < 1 || month >12) {
Normal_month = 0;
}
if (date < 1 || date>31) {
Normal_date = 0;
}
}
void DataChange() {
if (year == 1989 || year == 2004) {
Cdate = 31;
}
if (month == 1 || month == 4 || month==5 || month ==7 ||month == 10 || month ==11 || month == 12) {
Cyear = 1999;
}
if (year <= 1994 && (month == 2 || month == 6 || month == 8)) {
Cmonth = 3;
}
if (year >= 1996 && (month == 2 || month == 6 || month == 8)) {
Cmonth = 9;
}
if (year == 1995 && (date > month + 2 || month == date)) {
Cmonth = 6;
}
}
? 4)找到Flags
? 简单测试一下,通过了!!!(相信仔细分析了源码的喵饱饱们,一定知道flag和程序输出的结果之间的对应关系)
|