【Android 逆向】【攻防世界】easy-so
1. apk安装到手机,随便输入点内容,提示错误
2. jadx打开apk
btn.setOnClickListener(new View.OnClickListener() { // from class: com.testjava.jack.pingan2.MainActivity.1
@Override // android.view.View.OnClickListener
public void onClick(View v) {
EditText et1 = (EditText) MainActivity.this.findViewById(R.id.editText);
String strIn = et1.getText().toString();
if (cyberpeace.CheckString(strIn) == 1) {
Toast.makeText(MainActivity.this, "验证通过!", 1).show();
} else {
Toast.makeText(MainActivity.this, "验证失败!", 1).show();
}
}
});
核心是这一行 cyberpeace.CheckString(strIn)
public class cyberpeace {
public static native int CheckString(String str);
static {
System.loadLibrary("cyberpeace");
}
}
那么算法在so中
3. IDA打开SO看一下
bool __fastcall Java_com_testjava_jack_pingan2_cyberpeace_CheckString(JNIEnv *env, jclass clz, jstring key)
{
const char *key_chars; // x20
__int64 key_len; // x0
signed int t_key_len; // w21
unsigned __int64 v6; // x22
_BYTE *v7; // x0
_BYTE *t_key_chars; // x19
size_t v9; // w2
unsigned __int64 v10; // x20
_BYTE *v11; // x8
char v12; // w9
char v13; // w10
char v14; // w9
__int64 v15; // x20
_BYTE *v16; // x8
char v17; // w10
unsigned __int64 v18; // x0
unsigned __int64 v19; // x8
key_chars = (*env)->GetStringUTFChars(env, key, 0LL);
key_len = strlen(key_chars);
t_key_len = key_len;
v6 = ((key_len << 32) + 0x100000000LL) >> 32;
v7 = malloc((unsigned __int64)((key_len << 32) + 0x100000000LL) >> 32);
t_key_chars = v7;
if ( v6 > t_key_len )
v9 = v6 - t_key_len;
else
v9 = 0;
memset(&v7[t_key_len], 0, v9);
memcpy(t_key_chars, key_chars, t_key_len);
if ( strlen(t_key_chars) >= 2uLL )
{
v10 = 0LL;
do
{
v11 = &t_key_chars[v10];
v12 = t_key_chars[v10 + 16];
v13 = t_key_chars[v10++];
*v11 = v12;
v11[16] = v13;
}
while ( (unsigned __int64)strlen(t_key_chars) >> 1 > v10 );
}
if ( *t_key_chars )
{
v14 = t_key_chars[1];
t_key_chars[1] = *t_key_chars;
*t_key_chars = v14;
if ( strlen(t_key_chars) >= 3uLL )
{
v15 = 0LL;
do
{
v16 = &t_key_chars[v15];
v17 = t_key_chars[v15 + 2];
v16[2] = t_key_chars[v15 + 3];
v16[3] = v17;
v18 = strlen(t_key_chars);
v19 = v15 + 4;
v15 += 2LL;
}
while ( v18 > v19 );
}
}
return strcmp(t_key_chars, "f72c5a36569418a20907b55be5bf95ad") == 0;
}
有点看不清,整理以下
i = 0;
do
{
v12 = t_key_chars[i + 16];
v13 = t_key_chars[i];
t_key_chars[i] = v12;
t_key_chars[i+16] = v13;
i++;
}
while ( strlen(t_key_chars) / 2 > i );
if ( *t_key_chars )
{
tmp = t_key_chars[1];
t_key_chars[1] = t_key_chars[0];
t_key_chars[0] = tmp;
if ( strlen(t_key_chars) >= 3uLL )
{
i = 0;
do
{
tmp = t_key_chars[i + 2];
t_key_chars[i+2] = t_key_chars[i + 3];
t_key_chars[i+3] = tmp;
v19 = i + 4;
i += 2;
}
while ( strlen(t_key_chars) > v19 );
}
}
可以看出,是先把32位字符串前十六位和后十六位换个位置,然后每两位互换位置
4 写出还原算法
key = 'f72c5a36569418a20907b55be5bf95ad'
def main():
print(key)
key_list = list(key)
t_len = len(key)
i = 0
v19 = 0
while v19 < t_len:
tmp = key_list[i+2]
key_list[i+2] = key_list[i+3]
key_list[i+3] = tmp
v19 = i+4
i += 2
tmp = key_list[1]
key_list[1] = key_list[0]
key_list[0] = tmp
print("after ======")
print(''.join(key_list))
i = 0
while i < t_len >> 1:
tmp = key_list[i+16]
key_list[i+16] = key_list[i]
key_list[i] = tmp
i += 1
print("after ======")
print(''.join(key_list))
main()
日志
f72c5a36569418a20907b55be5bf95ad
after ======
7fc2a5636549812a90705bb55efb59da
after ======
90705bb55efb59da7fc2a5636549812a # flag
成功获得flag
【Android 逆向】【攻防世界】easy-so的更多相关文章
- 逆向-攻防世界-crackme
查壳,nSpack壳,直接用软件脱壳,IDA载入程序. 很明显,就是将402130的数据和输入的数据进行异或,判断是否等于402150处的数据.dwrd占4字节. 这道题主要记录一下刚学到的,直接在I ...
- 逆向-攻防世界-maze
题目提示是走迷宫. IDA载入程序分析. 输入字符长度必须是24,开头必须是nctf{,结尾必须是}.在125处按R就可以变成字符. sub_400650和sub_400660是关键函数,分析sub_ ...
- 逆向-攻防世界-CSAW2013Reversing2
运行程序乱码,OD载入搜索字符串,断电到弹窗Flag附近. 发现跳过00B61000函数,弹窗乱码,我们试试调用00B61000函数.将00B61094的指令修改为JE SHORT 00B6109b. ...
- 逆向-攻防世界-logmein
iDA载入程序,shift+F12查看关键字符串,找到双击来到所在地址,进入函数 然后进入主函数, 经过分析,可以得出:输入的字符要等于 经过处理的v7和v8的异或.v8很明显,但是v7是怎么回事呢 ...
- 逆向-攻防世界-no-strings-attached
看题目就知道查找不到关键字符串,为防止踩坑,strings命令查看,没有找到有用的字符串.IDA载入程序查找入口函数, main函数中有4个函数,经过分析判断authenticate()为关键函数,跟 ...
- 攻防世界逆向——game
攻防世界逆向:game wp 攻防世界逆向新手区的一道题目. 是一道windows的creak,动态调试打开是这样的: 题目说明是让屏幕上所有的图像都亮之后,会出现flag,看来应该是可以玩出来的. ...
- [转]Android逆向之动态调试总结
一.在SO中关键函数上下断点 刚学逆向调试时.大多都满足于在SO中某关键函数上下断点.然后通过操作应用程序,去触发这个断点,然后进行调试 详细的步骤可以参见非虫大大的<Android软件安全与逆 ...
- Android 逆向project 实践篇
Android逆向project 实践篇 上篇给大家介绍的是基础+小Demo实践. 假设没有看过的同学能够进去看看.(逆向project 初篇) 本篇主要给大家介绍怎样反编译后改动源代码, 并打包执行 ...
- 攻防世界 reverse evil
这是2017 ddctf的一道逆向题, 挑战:<恶意软件分析> 赛题背景: 员工小A收到了一封邮件,带一个文档附件,小A随手打开了附件.随后IT部门发现小A的电脑发出了异常网络访问请求,进 ...
- 攻防世界 reverse 进阶 APK-逆向2
APK-逆向2 Hack-you-2014 (看名以为是安卓逆向呢0.0,搞错了吧) 程序是.net写的,直接祭出神器dnSpy 1 using System; 2 using System.Diag ...
随机推荐
- [转帖]KingbaseES 服务器运行参数分类
https://www.cnblogs.com/kingbase/p/16969149.html Kingbase 服务器运行参数分类 说明: KingbaseES 数据库中,服务器运行参数分为多种类 ...
- [转帖]Welcome to the di-kafkameter wiki!
https://github.com/rollno748/di-kafkameter/wiki#producer-elements Introduction DI-Kafkameter is a JM ...
- 【转帖】3.JVM内存结构概述
目录 1.JVM内存结构 1.JVM内存结构 在JVM系列的第一篇文章中已经给出了JVM内存结构的简图,下面是JVM内存结构更加详细的图. 同样,JVM的内存结构可以分为上中下3层. 上层主要是类加载 ...
- [转帖]查看x86 cpu睿频命令
查看cpu是否开启睿频,offline掉一些cpu核心后,查看cpu睿频是否升高? turbostat统计X86 处理器的频率.空闲状态.电源状态.温度等状态等 [root@rootbird~]# t ...
- [转帖]018 磁盘 IO 性能监控 / 压测工具 (sar、iotop、fio、iostat)
https://my.oschina.net/u/3113381/blog/5465063 1 sar 命令查看当前磁盘 IO 读写 sar(System Activity Reporter 系统 ...
- CentOS7 上面升级git 2.24的方法
本来想使用tar包进行安装 但是发现tar包安装时总是报错如下: [root@centos76 git-2.25.0]# make LINK git-imap-send imap-send.o: In ...
- 初识VUE响应式原理
作者:京东零售 吴静 自从Vue发布以来,就受到了广大开发人员的青睐,提到Vue,我们首先想到的就是Vue的响应式系统,那响应式系统到底是怎么回事呢?接下来我就给大家简单介绍一下Vue中的响应式原理. ...
- vue 路由守卫是否携带token
//整个实例出来 配置路由守卫 const router = new Router({ //这里面是路由配置哈 }) router.beforeEach((to, from, next) => ...
- 使用visio如何快速生成一个网格状图案,文档技巧!
如何使用visio如何快速生成一个网格状图案 我的成果图: 操作步骤如下: 1.新建一个visio文件,选择"基本框图".点击创建. 2.从左侧形状窗口中基本形状中选中正方形拖动到 ...
- 5.0 Python 定义并使用函数
函数是python程序中的基本模块化单位,它是一段可重用的代码,可以被多次调用执行.函数接受一些输入参数,并且在执行时可能会产生一些输出结果.函数定义了一个功能的封装,使得代码能够模块化和组织结构化, ...