今天看啥  ›  专栏  ›  看雪学苑

PWN 赛题解析

看雪学苑  · 公众号  · 互联网安全  · 2024-07-30 17:59

文章预览

一 stdout 问题 main函数: int __fastcall main (int argc, const char **argv, const char **envp) { char buf[ 80 ]; // [rsp+0h] [rbp-50h] BYREF init (argc, argv, envp); puts ( "where is my stdout???" ); read ( 0 , buf, 0x60 uLL); return 0 ; } vuln函数: ssize_t vuln () { char buf[32]; // [rsp+0h] [rbp-20h] BYREF return read ( 0 , buf, 0 x200uLL); } init函数: int init () { setvbuf (stdout, 0 LL, 0 , 0 LL); return setvbuf (stdin, 0 LL, 2 , 0 LL); } 一开始的思路是main函数栈溢出劫持至vuln函数,vuln函数栈溢出调用puts得到libc地址,但是 setvbuf(stdout, 0LL, 0, 0LL); 无法得到回显。 再者的思路是ret2csu,但是无法控制rcx第四个参数致使setvbuf报错,行不通。 解决办法 关键是init函数, setvbuf(stdout, 0LL, 0, 0LL) 标准输出全缓冲,即缓冲区被填满才会进行i/o操作。 int init () { ; return setvbuf(stdin, 0L L, 2 , 0L L); } 刷新缓冲区的方法: ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览