i春秋的try to pwn
i春秋上一堆50分的题,每次一看50分就觉得自己就是个弟弟
两个函数,一个是welcome,没有限制输入的无符号整数的长度
一个是menu
图片.png
漏洞点在welcome中,没有控制x的长度,而x往下走32个就是程序中不断出现的一个全局变量dword_80EFA00的地址。
menu函数中,判断dword_80EFA00不为空时会执行一个fclose(dword_80EFA00); 图片.png这道题题目是fake,其实点就是让我们构造一个fake file
如何构造fake file struct(来自博客https://blog.csdn.net/lee_ham/article/details/82823010)
我们使用fopen打开一个文件会在堆上分配一块内存区域用来存储FILE结构体,存储的结构体包含两个部分,前一部分为_IO_FILE结构体file,后一部分是一个指向struct IO_jump_t的指针vtable, 这个结构体种存储着一系列与文件IO相关的函数指针。
在我们调用fclose关闭一个文件时,我们最终会调用到vtable中存储的函数指针。如果我们能够将vtable中的指针替换为我们自己想要跳转到的地址就可以劫持程序流程。
虚表结构(来自博客https://blog.csdn.net/qq_29343201/article/details/69666824)
原始的虚表数据结构我实在是没有找到,不过大致的结构如下:
void * vtable[] = {
NULL, // "extra word"
NULL, // DUMMY
NULL, // finish
NULL, // overflow
NULL, // underflow
NULL, // uflow
NULL, // pbackfail
NULL, // xsputn
NULL, // xsgetn
NULL, // seekoff
NULL, // seekpos
NULL, // setbuf
NULL, // sync
NULL, // doallocate
NULL, // read
NULL, // write
NULL, // seek
NULL, // close
NULL, // stat
NULL, // showmanyc
NULL, // imbue
};
注释里边的就是每一个函数指针的名字,或者说作用。
其实在对FILE struct调用函数的时候,就是调用了该FILE的函数指针,比如调用fclose(someFile);
其实就相当于调用someFile这个file结构体虚表结构的close函数指针。
网友评论