Web-信息搜集
信息收集这里总结一些Web题中信息收集的情况:
源码泄露:ctrl+u查看源码或js文件获得flag。
game类型题目:一般为通关或达到某一要求获取flag,一般根据错误提示定位到关键位置后通过在console中修改变量值来改变程序执行流程输出flag。
协议体信息泄露:在network中查看请求头或cookie等获取信息。
Robots后台泄露:
robots.txt 一个非常重要得到文件,通常情况下,主要用于指定搜索引擎蜘蛛spider在网站里的抓取范围,用于声明蜘蛛不可以抓取哪些网站资源及可以抓取哪些网站资源。
通过访问url/robots.txt查看一些重要资源。
phps源码泄露:
phps文件作为备份文件,其中可能包含源码,通过url/index.phps访问下载备份文件。
其他常见的有linux的备份文件,比如index.php.swp还有www.zip等
源码压缩包泄露:同上,通过www.zip获取压缩包。
版本控制泄露源码:根据提示版本控制,想到常用的版本控制工具git,svn,尝试访问.git和.svn获取flag。
gi ...
PWN-tcache stashing unlink attack
tcache stashing unlink attack引自大佬:
[原创] CTF 中 glibc堆利用 及 IO_FILE 总结-Pwn-看雪-安全社区|安全招聘|kanxue.com
先来看house of lore,如果能够修改small bin的某个free chunk的bk为fake chunk,并且通过修改fake chunk的fd为该free chunk,绕过__glibc_unlikely( bck->fd != victim )检查,就可以通过申请堆块得到这个fake chunk,进而进行任意地址的读写操作。当在高版本libc下有tcache后,将会更加容易达成上述目的,因为当从small bin返回了一个所需大小的chunk后,在将剩余堆块放入tcache bin的过程中,除了检测了第一个堆块的fd指针外,都缺失了__glibc_unlikely (bck->fd != victim)的双向链表完整性检测,又calloc()会越过tcache取堆块,因此有了如下tcache_stashing_unlink_attack的攻击手段,并同时实现了libc ...
PWN-protobuf
Protobuf前言:有些pwn题会结合Protobuf来考查,不是很难,但是如果没了解过的话就没法正常做题。
简介Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。拿pwn中add举例,将index,size,data等一个结构体数据进行序列化传输,为了能够和程序进行交互,我们需要先逆向分析得到Protobuf结构体,然后构造序列化后的Protobuf与程序进行交互。
安装安装和分析流程参考大佬博客,这里不再赘述:
深入二进制安全:全面解析Protobuf_protoc buffer 安全性-CSDN博客
更新之前对于protobuf-3.6.1的,protoc-1.5是可以的,但是现在不行了,可能是google更新了,会提示protoc版本过低。
解决办法:安装protoc-3.19.0
123wget https://github.com/protocolbuffers/protobuf/releases/download/v3.19.0/protoc-3.19.0-linux-x86_ ...
PWN-stdout学习
stdoutstdin、stdout、stderr对应程序的输入流文件、输出流文件和错误流文件,默认情况下文件标识符为0、1、2。
很多pwn题在init中都有如下代码,这是初始化程序的io结构体,只有初始化之后,io函数才能在程序过程中打印数据,如果不初始化,就只能在exit结束的时候,才能一起把数据打印出来。。
123setvbuf(stdin, 0LL, 2, 0LL);setvbuf(stdout, 0LL, 2, 0LL);setvbuf(stdout, 0LL, 2, 0LL);
函数原型如下:
1int setvbuf(FILE *stream, char *buffer, int mode, size_t size)
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了一个打开的流。
buffer – 这是分配给用户的缓冲。如果设置为 NULL,该函数会自动分配一个指定大小的缓冲。
mode – 这指定了文件缓冲的模式。
而其中mode参数决定了文件缓存的模式:
对于stdout而言,mode为0时表示全缓冲,即程序在exit结束时或缓冲区 ...
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 | +------------- ...