Android 逆向初探

逆向分析课程小作业:

逆向分析对象:看雪CTF 2018年某题

image-20220406221318318

看看它是干啥的

1、安装模拟器。

由于Android的apk文件不能直接安装在电脑上,所以先下载一个模拟器,例如夜某模拟器。打开之后安装apk文件。

image-20220406224336286

2、简单测试一下

image-20220406224423737

尝试用工具分析一下

1、使用AndroidKiller工具

(评价:网上下载了一圈的AndroidKiller效果都不是很好,本喵经过魔幻的操作得到了尚可的效果,建议用老师的版本试一下)

推荐一个免费下载逆向工具的靠谱网址。(https://down.52pojie.cn/Tools/Android_Tools/)

​ 1)下载AndroidKiller

image-20220406224755206

直接用这个版本的AndroidKiller打开apk文件会得到反汇编失败的结果。

​ 2)下载Apktool

image-20220406224912844

​ 无需解压,替换AndroidKiller/bin/apktool/apktool目录下ShakaApktool.jar文件,并修改为相同的名字;再次尝试反汇编,可以得到理想的效果。

​ 3)反编译效果展示

image-20220406225220600

image-20220406225314161

需要重点关注的是res/values/目录下的文件是否齐全。

​ AndroidKiller的功能:它能帮助我们快速找到程序的入口(简直就是废物)

image-20220406225517544

2、使用JEB工具

(评价:牛的,用它比用AndroidKiller强太多了,又快又能反汇编;也比GDA强,反汇编效果比GDA的质量好)

​ 1)反汇编得到源代码

image-20220406225937189

​ 2)根据提示信息获取目标

​ 反汇编代码:

image-20220406230025241

​ Public.xml文件

image-20220406230115845

​ string.xml文件

image-20220406230137626

​ 首先根据输入错误的提示信息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

image-20220406230634118

​ 简单测试一下,通过了!!!(相信仔细分析了源码的喵饱饱们,一定知道flag和程序输出的结果之间的对应关系)

image-20220406230717161

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值