美文网首页
2019-11-18持续摸鱼

2019-11-18持续摸鱼

作者: 好大一只免孑 | 来源:发表于2021-01-03 14:48 被阅读0次

    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持续摸鱼

          本文链接:https://www.haomeiwen.com/subject/tjzbictx.html