【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 ...
随机推荐
- [转帖]一份快速实用的 tcpdump 命令参考手册
http://team.jiunile.com/blog/2019/06/tcpdump.html tcpdump 简介 对于 tcpdump 的使用,大部分管理员会分成两类.有一类管理员,他们熟知 ...
- [转帖]1.IPtable基础命令总结
https://www.cnblogs.com/kcxg/p/10350870.html 规则查询 #查看对应表中的所有规则 iptables -t 表名 -L #查看表的指定链中的规则 iptabl ...
- 事务提交之后再执行某些操作 → 引发对 TransactionSynchronizationManager 的探究
开心一刻 昨晚,小妹跟我妈聊天 小妹:妈,跟你商量个事,我想换车,资助我点呀 妈:哎呀,你那分扣的攒一堆都够考清华的,还换车资助点,有车开就不错了 小妹:你要是这么逼我,别说哪天我去学人家傍大款啊 妈 ...
- 【SpringBoot】当AOP引发的异常与@RestControllerAdvice擦肩而过:异常处理的盲点揭秘
各位上午/下午/晚上好呀! 今天在写bug的时候发现一个这样的问题: AOP抛出的异常竟然没有被@RestControllerAdvice注解修饰的异常统一处理类处理. 有一个需求,对某些加了自定义注 ...
- tensorflow语法【zip、tf.tile、tf.truncated_normal、tf.data.Dataset.from_tensor_slices、dataset中shuffle()】
相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...
- C/C++ 实现常用的线程注入
各种API远程线程注入的方法,分别是 远程线程注入,普通消息钩子注入,全局消息钩子注入,APC应用层异步注入,ZwCreateThreadEx强力注入,纯汇编实现的线程注入等. 简单编写DLL文件: ...
- Python 检测PE所启用保护方式
Python 通过pywin32模块调用WindowsAPI接口,实现对特定进程加载模块的枚举输出并检测该PE程序模块所启用的保护方式,此处枚举输出的是当前正在运行进程所加载模块的DLL模块信息,需要 ...
- pywin32 实现寻找窗体并模拟按键
import win32api import win32gui, win32con import win32clipboard import re import time class cWindow: ...
- c#树结构转npoi复杂表头
Vue 前端框架框架中采用树结构打印表头,为了前后端适配NPOI导出. 这里重点做树结构转换 NPOI 复杂表头的结构数据( 跨行.跨列),其它具体导出功能请参考 https://www.cnblo ...
- 常见的WCF面试问题
WCF和ASMX WebService的区别是什么? 最基本的区别在于,ASMX或者ASP.NET WebService是用来通过基于HTTP的SOAP来实现通讯.但WCF可以使用任意协议(HTTP, ...