2021卫生CTFWritreup
notebookadd 构造固定大小 0x108 的堆块,用下一个堆块的 prev_size 来构造链表,全局标志位记录链头的地址。问题在于 free 的没有重新调整找个链表的结构,依然保持着相同的链表结构。利用 show 可以将整个链表打印出来,需要是要调整全局指针和 unsortedbin 的关系,因为 free 进入unsortedbin 之后,下个堆的 prev_size 会被修改为 0x110 ,导致 show 的时候地址不可读而报错退出。
EXP12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758from pwn import *context.log_level = 'debug'#p = process("./chall")p = process("./chall", env={"LD_PRELOAD":"./ ...
2021 ijctf Writeup
baby-sum简而言之的话就是格式化字符串加上特殊栈空间排布
welcome 函数泄露出栈地址;cala 里面有个循环写入的功能函数,写入内容之后会调用 vuln ,里面就一个格式化函数漏洞;
使用 scanf(‘%8s’, &num) 在堆栈上读取 3 个输入 (0,1,2),num 是堆栈上指向 numbers[] 数组的指针,该数组每轮递增,偏移量:
6 –> 起始地址
7 –> 数字地址[0]
8 –> 下一帧指针(指向偏移量 16)
9 –> 从 calc() 返回 vuln() 的地址
10 –> 数字 [0] 在 [rbp-0x30]
11 –> 数字 [1] 在 [rbp-0x28]
12 –> [rbp-0x20] 处的格式将在 calc() 开始时设置为“%8s”
13 –> sum 变量,在 calc() 开头未定义…(可以通过welcome() 函数设置,qword 在(名称字符串+ 0x28)
14 –> i 在 [rbp-0x10] 处的变量在每轮增加 (0,1,2)
15 –> [rb ...
2021国赛华北赛区决赛Writeup
Pwn_checkinglibc 2.32 影响不大,没有涉及相关的防护措施,也给了 ld ,更好模拟远程换下加载方式:
1p = process(["./ld-2.32.so", "./pwn"], env={"LD_PRELOAD":"./libc.so.6"})
开局给了 text 段的地址,PIE 等于没开。然后可以想 bss 段写入非常长字符串,这里写入的应该是 ropchain ,因为这段空间没有执行权限。接着就是有一个栈溢出,溢出长度刚好覆盖 rip ,结合前面往 bss 段写入内容,判断是栈迁移。
elf 中没有足够的函数和 gadget ,决定第一步先用 puts 泄露出 libc 基地址,然后写入第二次的 ropchain ,设想构造之前遇到过的栈迁移的结构:
1234payload = 'a'*0x800#'a'*(0x800-8)+p64(bss+0x840-8)payload += p64(pop_rdi_ret)+ ...
仅offbynull攻击总结
特征标志
仅存在 off by null 漏洞
不能申请大于 fastbin 的堆块(可以申请也能用这种方法)
如果能申请大于 fastbin 的堆块,申请 0x101 覆盖成 0x100 并控制 prev_size ,就能向低地址的堆块合并
存在 scanf (或其他将 fastbin 放置到 unsortedbin 的途径)
单纯 offbynull 无法在 fastbin 中利用,需要结合 unsortedbin
适用glibc版本无论有无 tcache ,都能适用。
存在 tcache 则需要先将对应 size 填满,才能放入 fastbin 。
攻击效果造成堆重叠(chunk extend),进而控制各类 bin 中的指针,完成 getshell
原理难点在于:fastbin 堆块的 size 长度为 1 个字节(如:0xf0),如果 offbynull 覆盖 prev_inuse 时,会将整个 size 覆盖为 0x00 ,而这会引起报错。
解决思路:
利用 unsortedbin 形成时,会将其所在的前一个(高地址)非 topchunk 的堆块 prev_siz ...
2021国赛华南赛区决赛Writeup
iNote漏洞点edit 功能当写入 chunk size 长度的数据时,会造成 off by null
思路题目基于 libc2.27 ,仅有 off by null 一个漏洞。
填满 tcache 之后,将堆释放到 fastbin ,输入长字符串利用 scanf 触发 malloc 大堆块将 fastbin 整理到 unsortedbin ,泄露出 libc 地址
利用 offbynull 向前unlink合并将 prev_inuse 控制为 0 ,结合伪造 header 、offbynull 向后unlink制造堆重叠
输入长字符串利用 scanf 触发 malloc_consolidate :
1234567891011121314151617181920#step0:unsortedbin泄露libc地址for i in range(8): add(i,0x78)add(8,0x58)#后面offbynull构造0x110add(9,0x20)#后面offbynull构造0x110for i in list(range(8)): delete(i)p.se ...
2021 强网杯 Writeup
[强网先锋]no_output漏洞存在栈溢出:
思路远程存在 real_flag.txt 读入后 unk_804C080 是 0x3
在 read(0, buf, 0x30u); 输入 \x00 覆盖 unk_804C080 为 0x00 ,实现向 src 输入,输入对应内容进入 if 内
输入对应值后进入 if 内,配置了一个浮点数错误的 signal :在发生致命的算术运算错误时发出, 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误。由于 v1 固定是 1 ,所以这种制造错误的方法 pass 。不一定要是被 0 除以。2 的补码 INT_MIN/-1 除法陷阱也行:
1-2147483648/-1
产生错误之后跳转运行栈溢出函数
EXP1234567891011121314151617181920212223242526272829303132333435363738394041424344454647from pwn import *context.log_level = 'debug'context.terminal = [ ...
2021蓝帽杯华南赛区决赛Writeup
coverMain 函数有一个任意地址写入 1 字节漏洞:
同时程序留有后门函数:
利用任意地址写入一字节,修改 puts plt 表 jmp 部分汇编,跳转到 system 函数:
EXP123456789101112131415161718192021from pwn import *context.log_level='debug'context.terminal=['tmux','sp','-h']# p = process("./pwn")p = remote("118.190.62.234",12435)elf = ELF("./pwn")libc = ELF("/lib/i386-linux-gnu/libc.so.6")# gdb.attach(p,"b *0x0804875D")# raw_input()p.recvuntil("Try use a bullet to pw ...
pwntools发送eof信号
做题目遇到的两种 eof 信号需求情况:
发送 eof 之后,后续不需要继续输入(vnctf-White-Give-Flag)
发送 eof 之后,后续还需要继续输入(mtctf-blind)
eof 发送后继续输入不用 mtctf-blind 做例子,因为利用 eof 绕过第一层之后,由于题目其他方面而无法 getshell ,用一个 demo 例子(来源)代替:
1234567891011121314#include <stdio.h>#include <stdlib.h>#include <string.h>int main(void) { char buf[24]; while(1) { if(read(0,buf,16)==0) { break; } } read(0,buf,1000); return 0;}
题目要求第一个 read 返回值为 0 ,也就是输入字符串长度为 0 ,才能到达下面的 read 栈溢出漏洞。 ...
2021MTCTFWriteup
baby_focalglibc 2.31 ,没有 PIE ,没有输出功能,开沙盒的堆溢出:
没有输出功能思路基本都是攻击 stdout 泄露出 libc 地址,这条题目分配函数用的是 calloc ,相当于没有 tcache 存在的,攻击思路和 glibc 2.23 一样。然后就是利用 free_hook 栈迁移到堆上的 orw 。
思路
填满 tcache 之后,利用堆溢出形成堆重叠,形成两个指向同一个地址的指针。注意需要在第一个 unsortedbin 前面布置一个堆,用来修改 size 来绕过保护。
两个同一地址的指针,在 fastbin 写入 main_arena_xx 地址,爆破 1/16 到 stdout 上方,利用错位构造出符合 fastbin 的 size 位。
这篇文章末尾中有提及:http://blog.eonew.cn/archives/1190
修复 unsortedbin 恢复分配释放功能。利用堆溢出劫持 fastbin fd 指针将堆分配到堆指针数组(需要提前布置 size 绕过保护),实现任意地址写。
将 free_hook 劫持为 puts ...
e150a036
5cef23f373e591f73b0780f44e533ed0d3ed819ed94539aacbd49d448d83d203c86138188432ed081fb96647b11f4e3a368dbff21a107c0bf56a84e883b9e9e33008f6937bc89ddf2c43515884639c17b16be8fc8d7c60ab3918a7666f8afbdfd6ef22afa6448ec5230e4cbdb205b443dc1dce78bc1f81489eb2b8689922cc7ffcfa01b6870f03609a33ebed6664c0c9c091c5067672323ad3d5093313f6da15edc0464f67f35418be11e4d2bd27518f430de355636dfb2ad3ea81d4b2c0892aaa2a5f82c5966cbfdc30f29fb4152022511dae302e9ee3fc12b9589ca31fd55efaf2500ada4f88ae175f93a3366819c72dbf1cc7ddf26ebfa ...