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. [转帖]DOCKER默认网段和主机网段冲突解决

    https://www.cnblogs.com/yinliang/p/13189334.html 一. docker默认网卡docker0 172.17.0.0可能会与主机冲突,这时候需要修改dock ...

  2. [转帖]jmeter必备正则表达式

    元字符 .  注意是一个点号,表示匹配任意单个字符 \d 表示匹配任意单个数字 [0-9] 等价于0-9 [a-zA-Z] 等价于所有的大小写字母 限定符 +  加号,表示匹配至少大于1次(1次或多次 ...

  3. css hover频繁闪烁

    今天遇见一个问题. 在鼠标放上 图片上的时候. 删除图标一直不停的闪烁. 我当时觉得很奇怪,父子关系的结构 不应该闪烁呀. 看了下html和css,发现子元素(要hover)的元素是绝对定位了的 于是 ...

  4. 开源IM项目OpenIM发布消息推送api,支持应用与IM互通深度融合

    以办公场景为例,比如员工入职通知,放假通知等业务通知,由oa系统处理具体的业务逻辑,再调用消息推送api,触达到目标用户. 效果示例 以协同办公为例,员工收到系统推送的工作通知,有新任务需要处理. 员 ...

  5. Leetcode 2题 两数相加

    题目链接 https://leetcode-cn.com/problems/add-two-numbers/ 题目描述 给你两个非空的链表,表示两个非负的整数.它们每位数字都是按照逆序的方式存储的,并 ...

  6. Windows 堆管理机制 [3] Windows XP SP2 – Windows 2003 版本

    3. Windows XP SP2 – Windows 2003 3.1 环境准备 环境 环境准备 虚拟机 32位Windows XP SP2 \32位Windows XP SP3 调试器 OllyD ...

  7. 使用AI辅助写代码

    市面上的AI写代码 GitHub +OpenAI 出品的Copilot:https://copilot.github.com/ Tabnie:Code Faster with AI Code Comp ...

  8. Spring框架源码分析

    目录 Spring核心思想 Spring源码编译 自定义实现Spring框架IOC与DI Spring源码Ioc核心模块分析 BeanDefinition整体介绍 FactoryBean接口的使用 B ...

  9. 卧槽!这 5 个后端程序员学习指南竟然斩获超过 350k 的 star

    前段时间弄应届生学习指南的时候,整理了几个不错的开源文档,分享给小伙伴们!我觉得应该可以对大家有帮助. 本期文章对应的视频地址:https://www.bilibili.com/video/BV1xZ ...

  10. SqlSugar分页查询

    同步分页  int pagenumber= 1; // pagenumber是从1开始的不是从零开始的  int pageSize = 20;  int totalCount=0;  //单表分页   ...