ELF文件格式基础介绍
ELF文件全称为(Executable and Linkable Format)
概念ELF文件本质上是一种数据结构,数据的载体。
于ELF相关的几个概念:
Section
组成ELF内容的最基本单元。
具体的可见上图.dynsym,.dynstr,.hash,.bss,.txt,……
每一个都是一个section
Segment
执行过程中的加载映射的最小单元,一个Segment即是多个Section的集合。
Linkable View
ELF 未被加载到内存执行前,以 section 为单位的数据组织形式
Executable View
ELF 被加载到内存后,以 segment 为单位的数据组织形式
看到这可以会有一个问题——“关于为什么有Section,Segment,Linkable View,Executable View“
其实很简单,ELF被切分成两个大的过程 编译,执行
Section & Linkable View是编译过程的数据呈现形式
Segment & Executable View是运行过程中的数据呈现 ...
2023
简介
“这一年比前几年有意思“
这里的“意思“不是指学到了啥,从利己的角度来看,今年并无什么特殊之处。
(一样的枯燥无聊)
更多是一些体验,去过一些地方,做过一些事,见过一些人。
学习
读了一些书
很好算半个读书人了。(我也不知道以后能不能坚持)
那些年我们一起刷过的题
个人链接
“那是一段黑暗的时光,没有任何光亮。“
LC好像没有年度汇总,如果有我之后补一个。
但是比起前年还是懈怠了(只是苦了我花钱买的VIP,老贵了)
写过写过一些blog(不太硬核,主打的就是菜)
工作
同事对我的评价是——
“a good guy who is talented at writing docs”
他真的是程序员?(不是)
TODO
增强技术深度
技术沉淀,突破技术壁垒,打通垂直领域(上班导致的)
多学点基础技术,一个懂操作系统,编译原理,汇编,计算机网络,数据结构,算法…的程序员真的“很帅“
多写点项目(前提是有足够的能力)
有的时候其实是有想法的,但是受限于能力,真的写不出来。(说白了就是菜)
实践是提升能力的最好手段(我说的) ...
glibc
认识Glibc概念
Glibc
glibc是linux下面c标准库的实现,即GNU C Library
和java的jdk,kotlin的stdlib类似。
查看我们所用的glibc版本
123➜ glibc getconf GNU_LIBC_VERSION# 输出glibc 2.31
关于陌生
我们其实对Glibc特别特别陌生,主要是当我们点开一些C语言的基础调用的时候,我们是看不了具体的源代码的。
所以就这样Glibc在我们心里越来越模糊,黑盒化
编译Glibc
认识Glibc的最好的方法就是编译它。打一个包,如果可以还可以装到Linux系统上自己用。
官方文档
下载下载地址
为了可玩性,笔者下载了最新版的Glibc
glibc-2.38.tar.gz
1234567891011# 下载➜ glibc curl -O https://mirror.koddos.net/gnu/libc/glibc-2.38.tar.gz# 解压➜ glibc tar -xvf glibc-2.38.tar.gz# check下是否安装完成➜ glibc lltot ...
WSL Mirrored NetworkMode
WSL镜像网络背景
在做一个安全试验的过程中:
需要将本机作为一个服务器与外部网络进行交互。
WSL默认是NAT的模式,无法实现于外网交互的逻辑。
Vmware作为虚拟机可以配置网络的状态为bridge,作为虚拟机的WSL是否也可以呢?
配置
修改.wslconfig文件
1234networkingMode=mirroreddnsTunneling=truefirewall=trueautoProxy=true
关闭wsl
1wsl --shutdown
重新进入wsl
参考链接知乎
WSL官网
bhook
BHooK基础使用概念BHookBHook是一个PLT hook框架
PLT hookPLT hook即Procedure Linkage Table Hook,即利用ELF文件链接过程的特性,修改PLT链接的函数地址。
实现对指定函数进行hook的效果
Quick Start具体可见官网教程
具体步骤
导入依赖
Java/Kotlin依赖导入
Cpp依赖导入
初始化
Hook
Hook API
在讲解API以前,需要说明一点,BHook是一个PLT Hook框架。
PLT是一种Native Hook技术,也就是说Hook的是C/C++代码
Caller调用方
函数调用中主动调用函数的一方
Callee被调用方
函数调用中被调用的一方
如下:
其中functionA是Caller
functionB是Callee
12345678void functionA() { // invoke functionB();}void functionB() { // do some}
by ...
JNI基础
基础概念JNI是什么
JNI是Java的一种功能接口,全称叫Java Native Interface
为什么需要 JNI
Java 运行是借助 JVM 的,但是 JVM 其实只是一个 C/C++的”应用“(JVM 也需要在计算机上跑)
有时候我们可能需要比较底层的调用,比如涉及到 OS 的相关操作,JVM 其实是无法实现的,所以需要 JNI对接 C/C++
Demo编程语言中都流行 Hello World,JNI 的 Hello World 是?
笔者是一个 Android/Kotlin 开发者,所以具体 Demo 使用 Kotlin
Kotlin
12345678910111213141516171819202122232425class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { ...
Android NDK 项目报错
背景在学习 ART-TI 的过程中发现了GitHub 有一个项目
但是把项目拉下来以后发现会有报错
解决
确认报错原因
从报错中很容易得出是 NDK 的配置问题
NDK not configured.
配置 NDK(官网配置教程)
12# local.propertiesndk.dir=/Users/fool/Library/Android/sdk/ndk/18.1.5063045
新的问题
Invalid revision: 3.22.1-g37088a8
查了下是 cmake 不兼容的问题。
配置了一下 cmake 版本
12# local.propertiescmake.dir=/Users/fool/Library/Android/sdk/cmake/3.6.4111459
配置成功
CONFIGURE SUCCESSFUL in 1s
总结下NDK 工厂需要配置
SDK
cmake
NDK
frida基础配置
Frida 环境搭建背景
最近工作中需要逆向对比,调研学习中发现了 Frida 这么一个不错的框架
基础条件设备:root 手机
配置安装 pip 依赖1pip install frida-tools
安装 frida-serverrelease
选择合适的版本(Frida 可以对Android/IOS/Mac/Window/Linux进行逆向分析)
记得选择 frida-server
push到手机
本文主要是进行 Android 逆向环境搭建
如果是其他平台,请在指定的平台允许 server 脚本
Unzip
1tar -xvf frida-server-XX.xz
Push
1adb push frida-server /data/local/tmp/frida-server
设置权限
1chmod 777 /data/local/tmp/frida-server
执行 frida-server1/data/local/tmp/frida-server &
完成
环境搭建完成
数据库多表查询
多表查询连接
既然是多表查询不可避免就会用到多个表的数据。
From连接多表
如下连接了AB两个表
123select ......from A, Bwhere A.XX = B.XX
自连接
内连接 inner join
外连接
left join
1234select ......from Aleft join Bon XXXX
right join
1234select ......from Aright join Bon XXXXX
full join
1234select .....from Afull join Bon XXXXXX
嵌套子查询
及查询过程中内嵌一个查询
in
如果A的过滤条件需要用到另外一张表的数据。
123456select *from Awhere XX in ( select XX from B where condition)
exists
上方in等价,个人觉得适用于多过滤条件的情况
123456789select *from Awhere exists ( select * fro ...
ASM基础使用
ASMCore ApiClassVisitor123456789101112131415visit[visitSource][visitModule][visitNestHost][visitOuterClass](visitAnnotation|visitTypeAnnotation|visitAttribute)*(visitNestMember|[*visitPermittedSubclass]|visitInnerClass|visitRecordComponent|visitField|visitMethod)*visitEnd
visit
标记ClassVisitor开始
12345678override fun visit( version: Int, // 字节码版本号 access: Int, // 访问修饰符 name: String, // 类名称 signature: String?, // 泛型签名 superName: String, // 父类 interfaces: Array<out String& ...