首页
社区
课程
招聘
未解决 [求助]windows保护模式-tss能进函数,但是出不来 10雪币
发表于: 2025-11-21 10:52 219

未解决 [求助]windows保护模式-tss能进函数,但是出不来 10雪币

2025-11-21 10:52
219

看的是滴水和火哥的教程,代码几乎一致,但是我就是跑不成功,是不是环境问题??

#include <iostream>
#include <windows.h>
typedef struct TSS {
    DWORD link; // 保存前一个 TSS 段选择子,使用 call 指令切换寄存器的时候由CPU填写。
    // 这 6 个值是固定不变的,用于提权,CPU 切换栈的时候用
    DWORD esp0; // 保存 0 环栈指针
    DWORD ss0;  // 保存 0 环栈段选择子
    DWORD esp1; // 保存 1 环栈指针
    DWORD ss1;  // 保存 1 环栈段选择子
    DWORD esp2; // 保存 2 环栈指针
    DWORD ss2;  // 保存 2 环栈段选择子
    // 下面这些都是用来做切换寄存器值用的,切换寄存器的时候由CPU自动填写。
    DWORD cr3;
    DWORD eip;
    DWORD eflags;
    DWORD eax;
    DWORD ecx;
    DWORD edx;
    DWORD ebx;
    DWORD esp;
    DWORD ebp;
    DWORD esi;
    DWORD edi;
    DWORD es;
    DWORD cs;
    DWORD ss;
    DWORD ds;
    DWORD fs;
    DWORD gs;
    DWORD ldt;
    // 这个暂时忽略
    DWORD io_map;
} TSS;
char stack[200] = { 0 };//自定义栈空间
DWORD dwH2G;
DWORD Mycr3;
TSS MyTSS =
{
       0x0,
       0x0,0x0,0x0,0x0,0x0,0x0,//esp0,ss0,esp1,ss1,esp2,ss2
       0x0,0x0,//cr3 eip
       0x0,//eflag
       0xaa,0xcc,0xdd,0xbb,//自定义了四个寄存器
       (DWORD)(stack + 100), //找到栈顶的位置 esp
       0x0,0x0,0x0,//ebp esi edi
       0x23,//es一般为23
       0x08,//cs
       0x10,//ss
       0x23, //ds一般是23
       0x30, //fs0环是30,3环是3b
       0x0, //gs一般为0
       0x0,  //windows没有ldt
       0x20ac0000 //固定值
};
char buffer2[6] = { 0x0,0x0,0x0,0x0,0x48,0x0 }; //0x48是我们构造的tss段描述符
void __declspec(naked) GetRegister()
{
    __asm
    {

        iretd
    }
}
int main(int argc, char* argv[])
{

    printf("my tss addr: 0x%X\n", &MyTSS);//获取自定义tss段的地址,用于制作tss段描述符
    MyTSS.eip = (DWORD)&GetRegister;
    MyTSS.eflags = 2;
    printf("input cr3==>");
    scanf_s("%X", &MyTSS.cr3); //这个需要在windbg里面看
    __asm
    {
        call fword ptr buffer2
    }
    printf("success!!!!!!!");
    return 0;
}

tss段描述符是0000e956`10000100

0x48:0就是第九个,没错把,进去是能进的,就是出来不行

抓耳挠腮,搞不明白。。。。。。。之前学调用门也是,直接跑就蓝屏,单步执行就没问题


传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回