2019-11-18持续摸鱼

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函数指针。

你可能感兴趣的:(2019-11-18持续摸鱼)