打了打宁波安全,虽然但是或许能拿到线下名额但是不想往那边跑了,一开学各种事情。但是比较难绷的是西湖论剑用了一摸一样的附件,还拿了道二血,还有更难绷的是另一个 pwn 靶机死活打不开导致另一个题目写都写不了
写西湖论剑的时候我一看附件都一模一样,由于一个是 apple 一个 vm 印象还是比较深的:

Regular_apples:

看一下 libc 版本:

IDA 静态分析:
main:

add:

size 会存入dword_4060[idx] 这个数组,chunk 地址会放在(_QWORD *)&unk_4140 + idx_1
简单来说 add 就会创建一个 0x500-0x530 大小的堆,之后允许写入内容
delete:

UAF
edit:

show:

seccomp:
沙箱这一块儿算是比较阴的一点吧,分析 ida 里面没看到有沙箱,实际上却是有沙箱的,禁用了 execve:

EXP 思路:
这道题目给的条件很多,也没有过多的限制,那么我们就可以比较轻松地拿到 libc_base 和 heap_base:
泄露 libc_base 和 heap_base:
1 | from pwn import* |

之后继续去泄露 heap_base:
1 | delete(2) |

largebin_attack:
考虑到后续再高版本的条件下要打 house of apple2,堆大小又限制在 largebin,我们只能利用 largebin_attack 去把地址写到 IO_list_all 上去填充数据:

1 | add(4,0x500,b'dddd') |
算是比较常见的手法了,构造一个基础的 largebin_attack,把 chunk8 的堆地址写到*(_IO_list_all)

apple2:
伪造一个 _IO_FILE,让 glibc 在 exit() 时把控制流带进 setcontext+0x3d,最后跳到堆上的 ROP 执行 orw
链子执行流程大概就是这样: exit -> _IO_flush_all_lockp -> fake FILE -> _IO_wfile_jumps -> fake wide_data -> fake wide vtable -> setcontext+0x3d ->rsp = heap_orw -> ORW

1 | def fake_file(fake_addr, libc_base): # 伪造的 FILE 结构所在 chunk 的 header 地址是 fake_addr |
总 EXP:
1 | from pwn import* |

1 | 1. largebin attack |
mvmph
总 exp:
1 | from pwn import * |
1. rawsys malloc/free 制造 unsorted bin
2. rawsys write 泄漏 r6 附近 0x9000 字节堆窗口
3. 从 unsorted bin fd/bk 得到 main_arena+0x60,计算 libc base
4. rawsys write 泄漏 libc.environ,得到栈地址
5. environ - 0x170 定位当前 mode0 handler 的 saved RIP
6. rawsys read 把 ret2libc ROP 链写到 saved RIP
7. handler 返回后执行 system("/bin/sh")
说些什么吧!