MIT 6.S081 Fall 2020 Lab 6
学!
学!
小做一下, 就当刷题了. 之前看第一题就不会, 然后没继续…
后来自己跌跌撞撞学了这么久, 组会的时候 bb 问我跟没跟过, 我说没…
学!
学一下 setcontext.
学!
FILE 设计了缓存区, 并且指针在 FILE 结构里. _IO_buf_base
和 _IO_buf_end
就分别指向了缓存区的起始地址和结束地址. 而关于读写的三个指针, 是同时使用这一块缓存区的. 比如以写操作为例, _IO_write_base
, _IO_write_ptr
, _IO_write_end
分别指向缓存区起始位置, 用户向缓存区写入的位置, 缓存区结束. 这些指针理论上来说都应该在 _IO_buf_base
和 _IO_buf_end
之内.
接下来就看程序会执行什么函数, 找满足什么条件能够 overflow (或者 underflow) 并且绕过, 通过覆盖缓存区指针, 构造任意地址读写.
下面会结合例题和 libc 源码, 详细讲如何构造和利用.
64 位 ELF, 保护全开, glibc 2.31. 程序首先读取了 /flag
的内容到 mmap 出的固定地址 0x233000 上. 然后设置沙箱, 基本上只允许读写. 最后执行 vuln 函数, 给出 libc 地址, 并且可以向任意地址写入 0x38 个字节.