Android-安卓逆向1
一、安卓开发初识平台:Android Studio Giraffe(2022)
SDK : 33
安卓开发是基于移动端开发的app,通过Android Studio设计,连接真机或虚拟机发行后进行测试。
1.环境安装(1) 首先官网安装Android Studio,之后安装sdk(连接移动端的桥梁,相当于java的jdk)
(2) 配置相关环境变量,将tools和platform-tools加入环境变量,没有的可以在AS的sdk tools中下载。
(3) 测试sdk中的adb,cmd命令行输入adb测试,adb是构建PC端和移动端的桥梁。
2.目录结构创建完一个empty project(java)后
(1) 最重要的是gradle(相当于web开发的maven),是项目构建的工具,可以帮助拉取远程仓库代码,其中有两个build.gradle,一个是项目的,另一个是模块的,在模块中定义了一些sdk版本以及一些包的远程地址和版本。
(2) 在src.main.java中,定义了MainActivity,相当于启动类,并且该类(所有类)需要在AndroidMainfest.xml中声明 ...
PWN-几个综合堆题
1.[CISCN 2021 初赛]silverwolf保护全开,且开启了沙箱,只能考虑orw读取flag。
add函数:分析发现程序中只有索引为0的chunk块才进行操作,因此程序中只存在一个chunk块,每次操作对最新add的chunk块进行操作。且只允许malloc的size小于等于0x78。
edit函数,读内容,不存在溢出。
show函数:打印chunk块的内容。
delete函数:存在明显uaf漏洞。
题目分析:
题目开启了沙箱,因此需要构造orw读取flag。
1、libc泄露,程序不允许申请大chunk,因此无法直接申请unsorted bin chunk后泄露main_arena。题目为libc2.27_1.4,考虑打tcache_struct,通过uaf申请到tcache_struct处,(2.27版本tcache_struct大小为0x250,大于2.29的版本为0x290),释放0x250的chunk块进入unsorted bin 进而泄露libc。
2、orw构造,泄露libc后通过查找libc里的gadget(syscall直接ROPgadget找不 ...
PWN-堆基础之Off By One
Off-By-OneOff-By-One即可以产生一个字节的溢出,Off-By-One中又包括Off-By-Null(poison_null_byte),即溢出的一个字节被设置为0,多产生于strcpy或自定义输入函数中,将末尾置空。
一般通过修改size字段进行漏洞利用。
Off-By-One利用场景1(控制heap_list):程序中存在Off-By-One漏洞会溢出修改heap_list(即bss上存放堆指针的)
利用思路:
首先在某块区域处构造一个fake_chunk块。
通过Off-By-One(null)溢出控制bss的最后一个字节指向构造的区域。
通过heap_list即可实现对fake_chunk块的读写操作。
**例题:Asis CTF 2016 b00ks**
漏洞点在于菜单之前输入user_name时,会产生off-by-null漏洞,而user_name后紧跟着的是heap_list。
add函数
12345678910111213141516171819202122232425262728293031323334353637383940414243444 ...
PWN-堆基础之LargeBin_Attack
LargeBin_AttackLargeBins结构:
bins[64] ~ bins[126]
63 个循环双向链表
FIFO
管理大于 504 Bytes 的 free chunks(32位下)
[
堆块结构:
1234567891011struct malloc_chunk { INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */ INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */ struct malloc_chunk* fd; /* double links -- used only if free. */ struct malloc_chunk* bk; /* Only used for large blocks: pointer to next larger size. */ struct malloc_chunk* fd_nex ...
PWN-几个简单堆题
1.hitcontraining_heapcreator一次add函数先申请固定0x10大小的chunk,又申请一个可控大小的chunk,其中第一个固定chunk的数据段存放第二个chunk的大小和第二个chunk的数据地址。
show函数会通过固定chunk块的数据地址找到固定chunk块打印内容。
漏洞点:edit编辑的时候,会读入size+1个字节,存在off-by-one漏洞。
漏洞利用:
通过off-by-one漏洞在修改chunk0时修改chunk1的size字段为较大字段0x81,此时free(1)再malloc(0x70)会将free掉的chunk1申请回来,并且申请回来的是0x80大小的chunk,这0x80大小的chunk是覆盖chunk2的,这样就实现了通过chunk1可以溢出到chunk2的内容(因为正常申请和释放是控制不到那个固定chunk块的,edit只能修改包含data的那个自定义chunk块)
修改chunk2的固定chunk块的chunk地址为free的got表地址,这样show调用时会打印处got表地址存放的内容,也就是free在libc中的真实 ...
PWN-PIE学习
PIEPIE全称是position-independent executable,中文解释为地址无关可执行文件,该技术是一个针对代码段(.text)、数据段(.data)、未初始化全局变量段(.bss)等固定地址的一个防护技术,如果程序开启了PIE保护的话,在每次加载程序时都变换加载地址,从而不能通过ROPgadget等一些工具来帮助解题
开启PIE保护的时候每次运行时加载地址是随机变化的
PIE绕过方法1.partial writepartial write就是利用了PIE技术的缺陷。内存是以页载入机制,如果开启PIE保护的话,只能影响到单个内存页,一个内存页大小为0x1000,那么就意味着不管地址怎么变,某一条指令的后三位十六进制数的地址是始终不变的。因此我们可以通过覆盖地址的后几位来可以控制程序的流程。(开启了PIE的程序在ida中地址都较小,text段一般为后三或四位,该地址为实际地址相对于程序的基地址的偏移。未开启PIE的程序在ida中地址为实际地址)
程序开启PIE后,可以修改vuln函数返回值的后四位位后门函数后四位(即ida中地址),原返回地址为main函数,由于mai ...
PWN-Canary学习
Canary原理
通常栈溢出的利用方式是通过溢出存在于栈上的局部变量,从而让多出来的数据覆盖ebp,eip等,从而达到劫持控制流的目的。栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址让shellcode执行。
当启用栈保护时,函数开始执行的时候会先往栈底插入cookie信息,如果不合法就停止程序运行(栈溢出发生)。攻击者在覆盖返回地址的时候往往也会将cookie信息覆盖掉,导致栈保护检查失败而阻止shellcode的执行,避免漏洞利用成功。在linux中我们将cookie信息成为canary。
64位系统中其栈结构如下1234567891011121314High Address | | +-----------------+ | args | +-----------------+ | return address | +------------- ...
Pwn-浅谈orw利用
沙箱沙箱保护是对程序加入一些保护,最常见的是禁用一些系统调用,如execve,使得我们不能通过系统调用execve或system等获取到远程终端权限,因此只能通过ROP的方式调用open, read, write的来读取并打印flag 内容
123fd = open('/flag','r')read(fd,buf,len)write(1,buf,len)
开启沙盒的两种方式在ctf的pwn题中一般有两种函数调用方式实现沙盒机制,第一种是采用prctl函数调用,第二种是使用seccomp库函数。
prctl函数调用如:
1return prctl(22, 2LL, &v1);
123456789101112131415// 函数原型#include <sys/prctl.h>int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5);// option选项有很多,剩下的参数也由opt ...
PWN-堆基础之House of Orange
House of Orange1.IO_FILE在看House of Orange的例子之前,我们首先了解一个Linux中的利用机制_IO_FILE
可以使用ptype /o struct _IO_FILE查看这个结构的定义,在pwndbg中可以直接写为dt FILE
_IO_FILE这个结构体中有一个_chain可以看到它的类型是一个struct _IO_FILE *,也就是说是一个指向其他_IO_FILE结构体的指针;在使用fopen之类的函数打开一个文件之后,实际上系统会在堆上创建一个这样的_IO_FILE结构体,并将其加入到一个单链表中,单链表的头部为_IO_list_all,这个单链表可以理解为是一个专门存储_IO_FILE的fastbin。另外vtable为虚函数表指针,实际上是为了与C++的streambuf类兼容才会出现的,但是这里兼容性上的问题,让GLIBC的file stream有可能存在虚函数表劫持的漏洞
另一方面,我们知道Linux的文件系统中一切皆为文件
每一个进程创建时都会有三个标准I/O File Stream:
stdin
stdout
s ...
PWN-堆基础之Unsorted bin
Unsorted bin1.Unsorted bin leak简介
通过unsorted bin的partial unlink,泄露main_arena地址信息,通过计算在libc中的偏移进而获取libc基地址。
条件
1.存在UAF漏洞 或 其它可以修改unsorted bin中chunk的bk指针的漏洞。
2.glibc <= 2.28(2.29引入了UsortedBin Attack的缓解机制)。
利用
前面unsorted bin的基础知识中,我们了解到unsotred bin中的chunk会被分类到small bin和large bin
中。
这些chunk在被分类时,需要进行partial unlink操作。相比于之前提到的unlink,这里的断开连接更简
单:
victim的fd指针总是指向unsorted bin的头结点,因此可以被忽略。
victim->bk.fd = unsorted_bin_head
unsorted_bin_head.bk = victim.bk
首先,构造如下chunk:
12345c ...