tcache_perthread_struct
tcache_perthread_struct 是GLIBC从2.27开始引入的机制,用于 add 有限的 chuank 数量,可以申请的 size 过小无法 free 到unsorted bin。 tcache的结构体定义12345typedef struct tcache_perthread_struct{ char counts[TCACHE_MAX_BINS]; tcache_entry *entries[TCACHE_MAX_BINS];} tcache_perthread_struct; tcache_perthread_struct 在本质上是一个 0x250-0x290的堆结构 1234567891011pwndbg> x/20gx 0x4050000x405000: 0x0000000000000000 0x00000000000002510x405010: 0x0000000000000000 0x00000000000000000x405020: 0x0000000000000000 0x00000000000000000...
CVE-2022-26258
固件地址:http://www.dlinktw.com.tw/techsupport/download.ashx?file=2663 环境 Ubuntu18,(22 在模拟固件时会有问题) FirmAE 下载12345678# 从GitHub克隆项目git clone --recursive https://github.com/pr0v3rbs/FirmAE# 运行download.sh脚本,下载相关程序./download.sh#运行安装脚本./install.sh binwalk 下载123pip3 install git+https://github.com/ReFirmLabs/binwalk.gitcd binwalkpython3 setup.py install CVE-2022-26258 固件模拟无法转发至宿主机,所以在 Ubuntu18 中安装 bp 进行操作 可以参考以下师傅的文章https://blog.csdn.net/dustbinhoj/article/details/128587565 使用binwalk 进行解包1binwalk -Me...
侧信道爆破
侧信道攻击是一种非正常的攻击手段,是根据程序的反馈报错信息来参考的一种攻击方式 原理是讲 flag 文件中的字符读取到缓冲区,将文件中的字符一个字节一个字节的对比 使用前提: 1-输入的 shellcode 能够被执行 2-程序禁用了execve系统调用,和关闭了标准输出流才用必要进行使用,因为爆破所需要的时间较长 3-read、open、openat、readv、fread 都可以被使用,但是一定要确保可以打开文件并且 read 读取到 4-标准错误不能被关闭,我们需要更具系统的反馈信息进行循环判定 侧信道攻击其实是比较模板化的,基本可以套用以下公式 12345678910111213141516171819202122232425mov r12, 0x67616c66 ; 将字符串 "flag" 的 ASCII 值加载到寄存器 r12 中push r12 ; 将 r12 的值推送到栈上mov rdi, rsp ; 将栈上的地址赋给寄存器 rdixor esi, esi ; 将 es...
CTFshow PWN164
muea 中只有 add 和 delete add 中使用的是 realloc 什么是 realloc 呢? 可以参考如下文章 https://squarepants0.github.io/2020/11/18/2019-realloc-magic-realloc-yu-tcache/#toc-heading-2 简单来说就说 mallco 和 free 的结合 plus 版 1234567891011void *realloc(void *ptr, size_t size)# ptr=0 && size!=0# 视作mallco(size) 返回对应的地址# ptr!=0 && size==0# 视作free(ptr)#ptr!=0 && size!=0#当上一次mallco返回的ptr值的size > 现在需要申请的size,则会进行缩小,然后多余的进行free#当上一次mallco返回的ptr值的size < 现在需要申请的size,则会进行扩容#如果上一次mallco返回的ptr已经被free了,且 <...
CTFshow PWN162
此文章参考了: CTFshow PWN162 堆利用技巧大杂烩_ctfshow-pwn-162-CSDN博客 好好说话之IO_FILE利用(1):利用_IO_2_1_stdout泄露libc_libc泄露方式-CSDN博客 使用realloc函数来调整栈帧让one_gadget生效 - ZikH26 - 博客园 感谢师傅的讲解 本文章只描述了本地是操作是如何打通程序的,远程需要爆破出I0_2_1_stderr_ 的第四位 1/16 概率 本题使用了double_free,unsortedbin_attack 、_IO_2_1_stdout、house of spirit,UAF 经典的增删改查 add 后会有一个固定的 0x28 大小的 chunk,和一个自行输入 size 大小的 chunk,size 被限制大小,add 的 chunk 数量也被限制为 0x13,并且 s->data 为 inuse 此时的堆结构 show 是假函数,无法 show delete 函数中,if 检测 chunk_s+v1 实际上并不是inuse 的值,所以这边是一个假判...
CTFshow PWN160
libc 下载链接:https://files.buuoj.cn/files/85ee93d92fc553f78f195a133690eef3/libc-2.23.so 简单的增删改查 在 add 中,我们输入 size 创建的 chunk 为 s,固定生成的一个 chunk 为 v3 s 在 v3 内存的上方,后续将 s 的 data 段地址赋值给 v3data 段 将 v3 放入 chunk 管理数组 chunk_s 中 edit 函数中有验证 v3->s+v2 的值于 s 的 size 做比较,如果我们在 v3 和 s 之间添加 chunk 使其不连续即可绕过此检查 add 后的 chunk 如图所示 delete 函数中将 s 清空,未将 v3chunk 清空,存在 uaf,但是这题不用 uaf 也可以写 show 输出 s 和 v3 中的 nam 和 test edit 就是上面 add 中的修改 test 中使用的 目前我们的思路为: 使 s 和 v3 中有其他 chunk 存在,这样我们就可以绕过 edit 中的检测使其修改到别的 chunk 内容...
各大Linux的libc版本
libc 版本 Ubuntu Debian Cent OS Glibc 22.04 - - 2.34 20.04 11 - 2.31 - 10 8 2.28 18.04 - - 2.27 - 9 - 2.24 16.04 - - 2.23 14.04 8 - 2.19 13.04 - 7 2.17 12.04 - - 2.15 - 7 - 2.13 - - 6 2.12 通过程序函数的真实地址查询libc版本libc.rip 换libc、ld12patchelf --set-interpreter 新的ld文件的路径 当前程序名patchelf --replace-needed 原来第二行的==>前的libc名 新的libc文件的路径 当前程序名
系统调用号
64 位1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002...
pwntools
接受数据1234567891011121314p.interactive() #获取shell后进行交互p.recvall() #一直接收直到达到文件EOFp.recvline(keepends=False) #接收一行,keepends为是否保留行尾的\n。p.recv(numb=字节大小, timeout=default) #接收指定字节数p.recv()[从第几位接受:接收到第几位] #接收指定字节数、int(p.recv()[从第几位接受:接收到第几位],16)p.recvuntil(b'\n', drop=True) #直到接受到\n截至,接受到为字符型,无法直接进行计算使用int(p.recvuntil(b'\n', drop=True), 16) #可以使用int()强转为16进制u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))#使用u64打包接受,直到\x7f为止,用于接受地址,不足8位用\x00补齐int(p.recv(18), 16)...








