VCTF apple 复现(apple的通用模板)
VCTF apple 复现(apple的通用模板)
ElegyYuan0x1 看雪学苑 2024-05-28 17:59
本文参考的是Arahat0师傅(https://passport.kanxue.com/user-center-964693.htm)的脚本,这里主要介绍一下vctf apple的house of apple部分的思路。与常规的house of apple不同,这里将_wide_data指向劫持的FILE结构体加减偏移,来让脚本更加可以移植,最后实现栈迁移打ROP链的操作。
前情提要:要结合上一篇文章:vctf apples leak libc操作复现(https://bbs.kanxue.com/thread-281083.htm)来观看。在上一篇文章中我们通过较为复杂的overlapping实现了heap和libc的泄露,接下来我们通过劫持结构体来实现一次House of apple2的变形。
条件
◆泄露libc地址和堆地址
◆能劫持stdout
结构体实现对stdout
结构体的覆写
◆能触发puts函数
属性的偏移
各大结构体
建议和上面的偏移结合起来看 还是比较详细的
exp中伪造
先这里给出exp中伪造的stdout
结构体 方便我们后面分析
动调
目的:通过puts函数触发_IO_wfile_overflow
函数来调用_IO_wdoallocbuf
函数。
正常的调用链
为了搞清楚劫持原理 这里我们分析puts函数的源码
◆puts中调用_IO_file_xsputn
(stdout->vatble(0xd8)->_IO_file_xsputn(0x38))
– r14此时为 也就是_IO_file_jumps+0x38的位置
- 而r14是通过mov r14, [rdi+0D8h]取出来的 rdi为_IO_2_1_stdout_ 根据0xd8偏移可以知道是vatble属性
◆然后调用_IO_file_overflow
◆然后走向_IO_do_write
_IO_wfile_jumps结构体
所以要调用_IO_wfile_overflow
则需要vatble+0x38位置为_IO_wfile_jumps
+24 所以这里控制vtable为_IO_wfile_jumps
-0x20
_IO_wfile_overflow函数
我们最终是想要调用_IO_wdoallocbuf
函数
◆所以我们需要满足条件:
– f->_flags & _IO_NO_WRITES为0
-
(f->_flags & _IO_CURRENTLY_PUTTING) == 0
-
也就是_flags位置为0
-
f->_wide_data(0xa0)->_IO_write_base(0x20) == 0
-
_IO_wdoallocbuf函数
◆这里我们要执行_IO_WDOALLOCATE
从而调用我们伪造的函数 所以我们这里需要过掉保护fp->_wide_data->_IO_buf_base
和!(fp->_flags & _IO_UNBUFFERED)
也就是_wide_data(0xa0)的_IO_buf_base(0x38)偏移位置要为0。
触发_IO_WDOALLOCATE(fp)
这里等效为: *(fp->_wide_data(0xa0)->_wide_vtable(0xe0) + 0x68)(fp)
◆所以最终就成功调用leave retn指令
栈迁移
◆我们先看汇编代码:
◆可以看见这里把rdi
赋值给了rbx
而根据前面代码可以知道rdi是_io_wdoallocbuf
的参数 也就是fp也就是_IO_2_1_stdout_。
◆那么回顾我们前面的payload:
FILE.flags = 0
FILE._IO_read_ptr = pop_rbp
FILE._IO_read_end = heap_addr + 0x470 - 8
FILE._IO_read_base = leave_ret
◆然后我们pop_rbp
让rbp
变成我们存放payload的chunk内容然后再通过leave ret让rsp也移动到我们的chunk上 实现栈迁移 然后我们就可以愉快打rop链了
看雪ID:ElegyYuan0x1
https://bbs.kanxue.com/user-home-994584.htm
*本文为看雪论坛优秀文章,由 ElegyYuan0x1 原创,转载请注明来自看雪社区
# 往期推荐
球分享
球点赞
球在看
点击阅读原文查看更多