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的更多相关文章

  1. 逆向-攻防世界-crackme

    查壳,nSpack壳,直接用软件脱壳,IDA载入程序. 很明显,就是将402130的数据和输入的数据进行异或,判断是否等于402150处的数据.dwrd占4字节. 这道题主要记录一下刚学到的,直接在I ...

  2. 逆向-攻防世界-maze

    题目提示是走迷宫. IDA载入程序分析. 输入字符长度必须是24,开头必须是nctf{,结尾必须是}.在125处按R就可以变成字符. sub_400650和sub_400660是关键函数,分析sub_ ...

  3. 逆向-攻防世界-CSAW2013Reversing2

    运行程序乱码,OD载入搜索字符串,断电到弹窗Flag附近. 发现跳过00B61000函数,弹窗乱码,我们试试调用00B61000函数.将00B61094的指令修改为JE SHORT 00B6109b. ...

  4. 逆向-攻防世界-logmein

    iDA载入程序,shift+F12查看关键字符串,找到双击来到所在地址,进入函数 然后进入主函数, 经过分析,可以得出:输入的字符要等于  经过处理的v7和v8的异或.v8很明显,但是v7是怎么回事呢 ...

  5. 逆向-攻防世界-no-strings-attached

    看题目就知道查找不到关键字符串,为防止踩坑,strings命令查看,没有找到有用的字符串.IDA载入程序查找入口函数, main函数中有4个函数,经过分析判断authenticate()为关键函数,跟 ...

  6. 攻防世界逆向——game

    攻防世界逆向:game wp 攻防世界逆向新手区的一道题目. 是一道windows的creak,动态调试打开是这样的: 题目说明是让屏幕上所有的图像都亮之后,会出现flag,看来应该是可以玩出来的. ...

  7. [转]Android逆向之动态调试总结

    一.在SO中关键函数上下断点 刚学逆向调试时.大多都满足于在SO中某关键函数上下断点.然后通过操作应用程序,去触发这个断点,然后进行调试 详细的步骤可以参见非虫大大的<Android软件安全与逆 ...

  8. Android 逆向project 实践篇

    Android逆向project 实践篇 上篇给大家介绍的是基础+小Demo实践. 假设没有看过的同学能够进去看看.(逆向project 初篇) 本篇主要给大家介绍怎样反编译后改动源代码, 并打包执行 ...

  9. 攻防世界 reverse evil

    这是2017 ddctf的一道逆向题, 挑战:<恶意软件分析> 赛题背景: 员工小A收到了一封邮件,带一个文档附件,小A随手打开了附件.随后IT部门发现小A的电脑发出了异常网络访问请求,进 ...

  10. 攻防世界 reverse 进阶 APK-逆向2

    APK-逆向2 Hack-you-2014 (看名以为是安卓逆向呢0.0,搞错了吧) 程序是.net写的,直接祭出神器dnSpy 1 using System; 2 using System.Diag ...

随机推荐

  1. [转帖]TiDB 使用 dumpling 导出数据,并使用 lightning 导入到另一个 TiDB 库

    本文介绍从 TiDB-A 库导出数据到 TiDB-B 库: 导出 Dumpling 包含在 tidb-toolkit 安装包中,可在此下载. 从 TiDB/MySQL 导出数据 需要的权限 SELEC ...

  2. [粘贴]使用 Dumpling 导出数据

    https://docs.pingcap.com/zh/tidb/stable/dumpling-overview#dumpling-%E4%B8%BB%E8%A6%81%E9%80%89%E9%A1 ...

  3. CoreMark简单学习

    CoreMark简单学习 下载 https://github.com/eembc/coremark-pro 需要注意, 其实coremark是有两组. 一组是coremark 一组是 coremark ...

  4. CentOS7升级Glibc到超过2.17版本无法启动的解决办法

    CentOS7升级Glibc到超过2.17版本无法启动的解决办法 背景 今天有同事告知服务器宕机无法启动. 提示信息为: [sda] Assuming drive cache: write throu ...

  5. 京东ES支持ZSTD压缩算法上线了:高性能,低成本 | 京东云技术团队

    ​ 1 前言 在<ElasticSearch降本增效常见的方法>一文中曾提到过zstd压缩算法[1],一步一个脚印我们终于在京东ES上线支持了zstd:我觉得促使目标完成主要以下几点原因: ...

  6. 从源代码构建TensorFlow流程记录

    京东科技隐私计算产品部 曹雨晨 为什么从源代码构建 通常情况下,直接安装构建好的.whl即可.不过,当需要一些特殊配置(或者闲来无事想体会 TensorFlow 构建过程到底有多麻烦)的时候,则需要选 ...

  7. 在Unity中使用SQLite保存配置表数据(For Lua)

    在Lua中使用sqlite Lua版本Sqlite文档:http://lua.sqlite.org/index.cgi/doc/tip/doc/lsqlite3.wiki sqlite官网:https ...

  8. Vue双向数据绑定原理-中

    defineProperty方法 defineProperty除了可以动态修改/新增对象的属性以外, 还可以在修改/新增的时候给该属性添加get/set方法, 从而实现数据劫持. defineProp ...

  9. libuv计时器

    目录 1.uv_timer_t - 计时器句柄 2.API 2.1.uv_timer_init 2.2.uv_timer_start 2.3.uv_timer_stop 2.4.uv_timer_ag ...

  10. 香橙派上的eMMC分区

    准备工作 OrangePi Plus 2E(自带16G的eMMC存储,出厂默认eMMC中附带了Android系统,用于测试板子功能) Ubuntu16.04的TF卡 第一张方式: 该方式可以按需删除指 ...