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 –> [rbp-8] 处的 num 指针每回合递增,指向开头的 &numbers[0] ..
- 16 –> 下一帧指针(指向偏移量 20)
- 17 –> calc() 的返回地址
思路大概就是:先将计数变量置为负数;放 %1$p 到数组上面等下用来泄露;将 scanf 输入的格式化字符串替换为 %ld ,后面用来写入地址;用 welcome 泄露的地址找到 main 函数返回地址从而泄露出 libc 地址;写 onegadget
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 SkYe231 Blog!