• 让程序强行加载特定版本Glibc

    通过 LD_LIBRARY_PATH 或者 LD_PRELOAD(库打桩机制:运行时打桩)因为 ld.so 和 libc.so 不匹配的原因,所以直接设置 LD_PRELOAD 可能会炸,就如下所示… 12$ LD_PRELOAD=./libc.so.6 ./baby_tcache段错误 (核心已转储) 可以将配套的 ld 和 libc 一起使用即可实现动态加载 libc。只需将下面代码中...
  • Fastbin attack

    劫持 fastbin 链表中 chunk 的 fd 指针,把 fd 指针指向我们想要分配的地址处,从而实现控制一些关键数据,比如返回地址等。 fd 指向的内存能申请出来的前提是该内存对应 size 处的值与该 fast bin 对应 size 相同。 12345678910111213141516171819#define SIZE_BITS (PREV_INUSE | IS_MMAPPED...
  • 堆相关数据结构

    malloc_par在 ptmalloc 中使用 malloc_par 结构体来记录堆管理器的相关参数,该结构体定义于 malloc.c 中,如下: 12345678910111213141516171819202122232425262728struct malloc_par{ /* Tunable parameters */ unsigned long trim_thres...
  • 堆基本概念

    ptmalloc2 是目前 Linux 标准发行版中使用的堆分配器。内存分配基本思想 堆管理器负责向操作系统申请内存,然后将其返回给用户程序,但是频繁的系统调用会造成大量的开销。为了保持内存管理的高效性,内核一般都会预先分配很大的一块连续的内存,然后让堆管理器通过某种算法管理这块内存。只有当出现了堆空间不足的情况,堆管理器才会再次与操作系统进行交互。 一般来说,用户释放的内存并不是直接返还给...
  • Canary--劫持tls上的canary

    覆盖 canary 初始值linux 下 fs 寄存器指向当前栈的 TLS 结构,fs:0x28 指向的是 TLS 结构中的 stack_guard 值,如果可以覆盖位于 TLS 中的 canary 初始值就可以绕过 canary 保护。 示例程序: 12345678910111213141516171819202122232425262728293031323334#include<...
  • Canary--利用__stack_chk_fail函数泄露数据

    __stack_chk_fail 函数输出错误信息时会把 __libc_argv[0] 作为信息输出,也就是 main 函数参数的 argv[0],这个参数保存在栈中,如果可以覆盖该参数,也就可以打印出需要泄露的信息。 注意高版本的 libc 的 __fortify_fail 函数并不会打印 __libc_argv[0] 。 1234567891011void __attribute__ (...
  • Canary--劫持__stack_chk_fail函数

    canary 检测失败会调用 __stack_chk_fail 函数,可以通过比如格式化字符串漏洞修改 got 表中对应 __stack_chk_fail 的位置为后门函数的地址来实施攻击。 示例程序: 12345678910111213141516171819202122232425262728#include<stdio.h>#include<string.h>#...
  • Canary逐字节爆破

    canary 绕过泄露canary 利用栈溢出泄露canarycanary 以 \x00 结尾,通过栈溢出覆盖 canary 最低字节,之后输出输入内容时会连带将 canary 一同输出。 利用格式化字符串漏洞泄露 canary。 由于 canary 存储在栈上,因此很容易就可以利用格式化字符串漏洞泄露。 逐字节爆破例如下面的程序: 12345678910111213141516171...
  • 非栈上格式化字符串通用解法

    考虑构造任意地址写原语。由于格式化字符串在堆上,我们不能直接在栈上布置要写入的地址,因此需要借助栈上的 ebp 链进行构造。 我们发现只要栈上存在一个有 2 跳的 ebp链就可以构造栈上相对地址写原语: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546from pwn im...
  • 格式化字符串覆盖内存

    覆盖内存的原理是 %k$n 可以覆盖第 k 个参数指向的地址为已经输出的字符数量。 注意:覆盖内存只能覆盖栈上某地址指向的内存,而不是直接覆盖栈上某地址。 pwntools生成payload对于格式化字符串payload,pwntools也提供了一个可以直接使用的类Fmtstr,具体文档见http://docs.pwntools.com/en/stable/fmtstr.html,我们较常使...
1234