2022华东北 blue
前言day12每日一Pwn做到了这道题,自己独立分析的时候发现最多泄漏libc,之后就做不下去了,现在看完题解之后写一下学到的内容
题目链接:
https://www.nssctf.cn/problem/2390
题目分析glibc-2.31
禁用了free_hook malloc_hook
开了沙箱,禁用了了execve
没有edit功能,只能在add的时候edit。正常的delete函数没有uaf,但是存在一个backdoor函数,这个函数也是delete功能,但是存在uaf,但是这个函数只能使用一次;存在show函数,只能使用一次。
先讲一下我一开始的思路,利用largebin attack+house of apple2
但是考虑到一方面没有edit功能,不容易largebin attack,另一方面house of apple2最后是通过system来getshell,但是题目禁用了,于是作罢
house of botcake可以看到限制非常非常多,这里利用的手法就是 house of botcake
https://forum.butian.net/share/170 ...
IO攻击学习
前言 最近学了一下IO攻击相关的知识,于是就拿litCTF2024的题目来实验。
使用了largebin attack+house of apple2 攻击2.35的题目没有出现什么问题,但是在2.39的时候出现了问题,于是研究了一下两个libc的汇编代码(题目给的),发现2.39和2.35关于house of apple2还是有一点点微不足道的区别的
IO结构体struct _IO_FILE{ int _flags; /* High-order word is _IO_MAGIC; rest is flags. */ /* The following pointers correspond to the C++ streambuf protocol. */ char *_IO_read_ptr; /* Current read pointer */ char *_IO_read_end; /* End of get area. */ char *_IO_read_base; /* Start of putback+get area. */ char *_IO_ ...
2024网鼎杯半决赛cardmaster复现
前言去年打wdb的时候,libc2.27还没看过,所以导致没碰这道题,现在复现一下。
恢复结构体struct deck_cards{int suit_count;int digit_count;long long int randomize level;char* chara;void (*func)();all_suit* all_suit_heap;}struct all_suit{ suit* one_suit[4];}struct card{ long long int suit_point; long long int digit_point;}struct suit{ card one_card[13];}
这是我自己恢复的结构体。恢复结构体这一步是帮助后续分析的重中之重。
这里提一下如何在ida里插入自定义结构体:在ida里shift+F1,然后按下“Insert”键,即可插入自定义的结构体。
之后在变量上按下Y键,更改变量类型即可。
utf-8编码学习之前只知道utf-8是变长的,但是不知 ...
glibc2.27-2.35 tcache堆利用
前言本文记录了glibc2.27-glibc2.35关于tcache堆利用的一些变化
参考文章:
https://www.freebuf.com/articles/system/234219.html
https://www.roderickchan.cn/zh-cn/2023-03-01-analysis-of-glibc-heap-exploitation-in-high-version/
glibc2.27在 glibc 2.27 版本中,引入了 tcache 机制,用于优化堆分配的性能。tcache 适用于 0x20 到 0x410 字节范围内的小块内存。释放堆块时,glibc 会优先检查对应大小的 tcache 是否已满,只有在 tcache 满载时,堆块才会被存入 fastbin 或 unsorted bin 等其他 bin 结构。每个 tcache bin 最多可存储 7 个堆块。
在 glibc 2.27 及更早的版本中,tcache 机制缺乏安全性检查,允许 任意 double free。攻击者可以修改 tcache 中堆块的 fd 指针,该指针指向的是前一个堆块 ...
asis_2016_b00ks
前言一篇题解,针对off_by_null漏洞的攻击
https://www.52pojie.cn/thread-1825637-1-1.html
参考的这个博客
网上的题解一般是两种方法,一个是mmap泄漏libc地址,一个是unsorted bin泄漏libc
本篇是unsorted bin泄漏libc
分析漏洞点在read_n函数里面
__int64 __fastcall read_n(_BYTE *a1, int a2){ int i; // [rsp+14h] [rbp-Ch] if ( a2 <= 0 ) return 0LL; for ( i = 0; ; ++i ) { if ( read(0, a1, 1uLL) != 1 ) return 1LL; if ( *a1 == '\n' ) break; ++a1; if ( i == a2 ) break; } *a1 = 0; ...
领航杯2024决赛pwn
前言我是菜狗,比赛场上没搞出来,赛后让pwn爹指导的
非传统pwn题,题目写了一个web服务器
如果我能多学一点web的东西是不是就能做出来了,赛场上连payload怎么写都不会
题目分析__int64 __fastcall in_whitelist(const char *a1){ int i; // [rsp+1Ch] [rbp-34h] char *needle[6]; // [rsp+20h] [rbp-30h] needle[5] = __readfsqword(0x28u); needle[0] = "Blue"; needle[1] = "Red"; needle[2] = "Yellow"; needle[3] = "Green"; for ( i = 0; i <= 3; ++i ) { if ( strstr(a1, needle[i]) ) return 1LL; } return 0LL;}
这里有 ...
LitCTF 2024 heap-2.23
前言
https://www.nssctf.cn/problem/5614
libc2.23版本的堆题,非常简单,但是是我自己独立完成的非教程题目的第一个题
分析菜单题,增删查改一应俱全
有UAF漏洞,申请的堆块大小自己设定
有UAF的话我们就可以很轻松的泄漏出libc,首先申请一个非fastbin大小的堆块,比如malloc(0x80)
delete一下它,然后show一下就可以得到unsorted bin地址,也就能知道libc地址
我之后的思路是利用uaf漏洞来Arbitrary Alloc,利用fastbin单向链表的性质,通过字节错位的方法来申请到__malloc_hook所在的空间。
然后再改写__malloc_hook到one_gadget就行了。
expfrom pwn import *context(log_level='debug', arch='i386', os='linux')context.terminal = ["tmux", "splitw", &quo ...
babyheap_0ctf_2017
前言一篇题解,glibc2.23 主要是fastbins攻击的
https://www.yuque.com/hxfqg9/bin/dww8nz#EPTbD
主要参考这个师傅的
分析题目开全了保护,因此就无法通过改got表的方式getshell
这个题相当于自己写了一个堆管理器,在填充(fill)的时候,还要求输入你要填充后过多少个字节,但是可以输入比申请的大的数,因此可以任意的进行堆溢出
先贴出自己的exp,实际上只能本地打,不知道为什么远程报超时?我看alarm函数给了60秒
from pwn import *#context(log_level='debug', arch='amd64', os='linux')#context.terminal = ["tmux", "splitw", "-h"]p=process('./babyheap_0ctf_2017')#p=remote('node5.buuoj.cn',28 ...
house_of_spirit
House of spirit一种针对fastbin的攻击
什么情况下使用?当有一块区域,这个区域上下两部分你都能控制,但是区域内部无法控制,并且区域内部有重要数据,比如返回地址。
(一般来说,这块区域指的是某个函数栈帧的位置,这个函数的父函数中有局部变量能够控制,这个函数里面还有局部变量你能够控制)
使用house of spirit可以通过控制前后区域来控制整片区域。
使用条件
fake chunk 的 ISMMAP 位不能为 1,因为 free 时,如果是 mmap 的 chunk,会单独处理
fake chunk 地址需要对齐, MALLOC_ALIGN_MASK (0x10!! )
fake chunk 的 size 大小需要满足对应的 fastbin 的需求,同时也得对齐 (size直接写成0xN0即可)
fake chunk 的 next chunk 的大小不能小于 2 * SIZE_SZ (16),同时也不能大于av->system_mem(128kb)
fake chunk 对应的 fastbin 链表头部不能是该 fake chunk,即不能构成 ...
堆1
前言很久之前学过一点堆知识,如今再次拾起来发现需要重新再学一遍……
因此在这里写一点自己在学习过程中的想法,以便未来的我看到这里可以快速想起知识
https://www.yuque.com/hxfqg9/bin/ape5up#kcNpL
简单堆结构使用中的:
基本来说是这个样子:
物理相邻的前堆块的大小
本堆块的大小
用户可以使用的空间开始
注意P位,当它是0的时候标志物理相邻的前一个堆块是被释放的,有时候可以合并
被释放后的:
物理相邻的前堆块的大小
本堆块的大小
fd指针
bk指针
fd_next_chunk指针
bk_previous_chunk指针
fastbin的时候(空间小的堆块回收到的地方),基本只用关注fd指针,fd指针指向前一个释放的堆块(同等大小)
a=malloc(0x10);b=malloc(0x10);free(a);free(b);
这个时候b堆块的fd指针就指向a开始的地方。但是要注意用户开始使用的空间和堆块开始的空间不一样,一般是+0x10。
UAF漏洞如果free(a)之后没有a=0,那么还能再 ...











