强网杯 tradre 复现
tradre复现1.fork()简介函数原型: pid_t fork(void);//pid_t为int类型,进行了重载pid_t getpid();// 获取当前进程的 pid 值。pid_t getppid(); //获取当前进程的父进程 pid 值。用于创建一个进程,所创建的进程复制父进程的代码段/数据段/BSS段/堆/栈等所有用户空间信息;在内核中操作系统重新为其申请了一个PCB,并使用父进程的PCB进行初始化。 2.ptrace 基础介绍 ptrace 是 linux内核 提供的一个系统调用,并非一个标准的posix接口,ptrace 主要用于进程跟踪和调试。它运行一个用户态进程(通常称为跟踪器, Tracer)控制和监视另一个进程(称为被调试进程, Tracee)的执行。ptrace是许多调试跟踪工具(如:GDB、strace 等)的 “基座”,其函数原型如下: 参数: request:用于标识一个需要执行的操作; pid:标识目标线程ID addr...
熊大快跑免费充值版逆向分析
熊大快跑免费充值版这里我们需要hook的是支付宝的充值功能,这里用算法助手抓取弹窗 所以在支付界面选择支付宝 弹窗之后进算法助手查看日志 根据这个信息找到com.xiaomi.gamecenter.sdk.ui.paylistactivity 这里应该是生成支付订单列表信息的 找到关键函数 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889public void onItemClick(AdapterView<?> adapterView, View view, int i, long j) { if (PatchProxy.proxy(new Object[]{adapterView, view, new Integer(i), new Lo...
2026长城杯决赛 dumbcpp 题目复现
2026长城杯决赛题目复现解压附件打开发现Unity引擎,GameAssembly.dll和global-metadata.dat 可以确定这题是il2cpp_data 尝试用Il2CppDumper来dump 发现dump失败,查壳发现GameAssembly.dll加了壳 当时线下赛,之前都没见过这个壳,一下子就卡住了,之前在52pj里面下了一个re工具包,里面有themida的脱壳工具,但是没一个能脱壳成功的,根据之前的经验,通过CE中的mono插件能够进行一些分析,所以我就尝试了一下用CE来看这个exe程序 在Assembly-Csharp.dll中找到了一些可疑函数, 这里经过确认,发现程序的主要逻辑还是在check_input这个函数中 check_input 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081...
ydsj逆向分析:脱壳、反调试绕过与刷数据实现
一、脱壳脱壳这里没细看,看到有壳就直接用脱壳网站解了 二、反调试绕过方法说明2.0 检测发现方法最初现象是:Frida spawn 后应用会弹出“检测到该应用在 hook 环境中运行”的风险提示,随后原进程被终止/重启。早期如果只观察线程存活时间,会被自动重启误导;真正关键是原始 PID 在进入 Home/主界面附近被检测链替换或杀死。 诊断过程采用了几类证据交叉确认: 运行时日志:观察 Frida attach/spawn 后哪个 so 加载、哪个线程创建、哪个分支触发风险提示。 pthread_create 入口跟踪:定位 libnesec.so 和 libnllvm*.so 创建的检测线程。 linker 加载时机跟踪:hook do_dlopen / call_constructors,确保在目标 so 构造阶段或刚加载完成时安装 patch。 maps 读取跟踪:确认 libnesec.so 会读取 /proc/self/maps 并匹配 Frida 痕迹。 Crash/ANR 现象对比:排除单纯 exit/kill,...
攻防世界 mobile 丛林的秘密
攻防世界 mobile 丛林的秘密 先进jadx中看java代码 看到有个check_key 先跟进去看看 发现在native层直接进so文件里面看 找到验证函数 根据代码分析 v6应该就是我们输入的数据 伪随机数先和aD584a68d4e213d数组比较 不等于的话返回1 再去和v6比较 很明显这是不会成立的 不由得怀疑这是不是假的check_key函数 我们在native层还看到了另一个函数sayHello 不妨换个思路 点进去看看 发现传入了一个本地网址 http://127.0.0.1:8000 再跟进JNI_OnLoad函数 这是一个so文件初始化的函数 加载so文件会优先加载这个函数 跟进inti_proc 这个函数主要是进行了服务器初始化的操作 对byte_3010这一数据进行了一系列解密处理 有点像smc自解密 一开始想通过动态调试解决这个代码问题 但是一直调不了 也找不到问题出在哪 又看到nullsub_函数对这个服务器发送了一个请求 把解密之后的byte_3010数据传到了服务器上 所以可以从服务器中直接读取数据 12adb shellcu...
L3Hctf复现
L3Hctf复现ez_android先将程序拖进jadx中分析 找到MainActivity 通过mainactivity找到TauriActivity 再通过TauriActivity找到WryActivity 发现主要逻辑都在native层里面 把so文件放进ida中分析 随便填点东西在程序里 输出了Wrong answer 再根据这个字符串在so层里面找 找到了greet函数 这里采用正向爆破的方法 代码如下 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354#include<stdio.h>#include <memory.h>#include<stdint.h>void jiami(uint8_t *a){ uint64_t v10; uint8_t v11; unsigned char aDghpc2lzywtleq[]="dGhpc2lzYWtleQ&quo...
Frida 0xB
Frida 0xB 通过分析上述代码可以看到主要逻辑还是在native层中的getFlag函数中 下面到so层进行分析 反编译出来发现什么都没有 但在汇编界面又能看到有东西 所以估计是进行了某些操作阻碍了ida的反编译 我们看到这里 它给rbp+var_24赋值为0x0DEADBEEF cmp [rbp+var_24], 539 又将这个值与0x539比较 所以这段代码永假,所以下面的代码全都会被跳过,不执行 这里直接nop掉 再反编译程序就出来了 所以我们只需要通过hook把刚才那个永假条件改成nop就行 大概思路就是找到那个永假条件的代码对应的地址 然后更改它的十六进制数据 改成90(nop)即可 或者改成74(jz) 具体代码实现是参考网上的wp写的 代码如下 12345678910111213141516171819202122232425262728293031323334353637383940function hookTestB(){var libc_base = Module.getBaseAddress("libfrida0...
Frida 0xA
Frida 0xA 基本上都是些初始化及画面设置的代码主要就是native层的stringFromJNI 仔细分析了一下 发现也没有什么和flag有关的东西 再看看左手边的函数表 发现有一个get_flag 所以我们需要主动调用so文件中的get_flag并在日志中查看即可 这里需要注意的是get_flag在so文件中并非真叫get_flag 而是需要切到汇编函数中去看 函数名字为_Z8get_flagii 代码如下 1234567891011121314151617181920function hookTestA(){var funcAddr = Module.findExportByName("libfrida0xa.so","_Z8get_flagii");//声明函数指针if (!funcAddr) { console.error("Function not found!"); return; }//NativeFunction的第一个参数是...
Frida 0x9
Frida 0x9 由上面的代码可知 我们只需要修改check_flag的值,让它返回值为1337即可 下面进到so层看看 代码如下 12345678910111213141516function hookTest9(){ let MainActivity = Java.use("com.ad2001.a0x9.MainActivity");MainActivity["check_flag"].implementation = function () { console.log(`MainActivity.check_flag is called`); let result = this["check_flag"](); console.log(`MainActivity.check_flag result=${result}`); return 1337;};}function main(){ Java.per...
Frida 0x8
Frida 0x8 可以看到这里的主要逻辑就是cmpstr这个方法,而这个方法又是在native层实现的,所以我们要进到so文件里面去看 从这我们可以看出s1就是我们输入的ip s2就是flag 所以,我们可以通过hook strcmp这个函数 来获取s2的值 但是需要注意的是 strcmp这个函数在很多地方都会被调用 所以直接打印s2的值会有很多值 但是也能从输出的数据找到flag 但也费时间 这里优化了一下 当s1的值满足特定条件的时候我们再输出s2的值 在代码中我是让s1=123 代码如下 1234567891011121314151617181920212223242526272829303132function hookTest8(){ Java.perform(function(){ //根据导出函数名打印地址 var helloAddr = Module.findExportByName("libfrida0x8.so","strcmp"); c...



