流沙团
TSS切换实验
2018-3-22 流沙团


0x001 TSS的基础知识



TSS是一段内存结构



char st[10] = {0}; // st 的地址是 0042b034
TSS tss = {// tss的地址是 0x00427b40
0x00000000,//link
(DWORD)st,//esp0
0x00000010,//ss0
0x00000000,//esp1
0x00000000,//ss1
0x00000000,//esp2
0x00000000,//ss2
0x00000000,//cr3
0x0040fad0,//eip
0x00000000,//eflags
0x00000000,//eax
0x00000000,//ecx
0x00000000,//edx
0x00000000,//ebx
(DWORD)st,//esp
0x00000000,//ebp
0x00000000,//esi
0x00000000,//edi
0x00000023,//es
0x00000008,//cs
0x00000010,//ss
0x00000023,//ds
0x00000030,//fs
0x00000000,//gs
0x00000000,//ldt
0x20ac0000
};



理解TR寄存器  TSS段描述符  TSS段的关系







0x002、测试代码



// 20180322_05.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

DWORD dwOK;
DWORD dwESP;
DWORD dwCS;

__declspec(naked)func()//00401020
{
dwOK = 1;
__asm{
//int 3
mov eax,esp
mov dwESP,eax
mov ax,cs
mov word ptr [dwCS],ax

//返回
iret
}
}

//eq 8003f0c0 0000e912`fdcc0068



int main(int argc, char* argv[])
{
char bu[0x10]; //0x12ff70
int iCr3;
printf("input CR3:\n");
scanf("%x",&iCr3); //!process 0 0 获取

//0012fDCC
DWORD iTSS[0x68]={
0x00000000,//link
(DWORD)bu,//esp0
0x00000010,//ss0
0x00000000,//esp1
0x00000000,//ss1
0x00000000,//esp2
0x00000000,//ss2
(DWORD)iCr3,//cr3
0x00401020,//eip
0x00000000,//eflags
0x00000000,//eax
0x00000000,//ecx
0x00000000,//edx
0x00000000,//ebx
(DWORD)bu,//esp
0x00000000,//ebp
0x00000000,//esi
0x00000000,//edi
0x00000023,//es
0x00000008,//cs
0x00000010,//ss
0x00000023,//ds
0x00000030,//fs
0x00000000,//gs
0x00000000,//ldt
0x20ac0000
};

char buff[6];

*(DWORD*)&buff[0] = 0x12345678;
*(WORD*)&buff[4] = 0x48;

__asm
{
call fword ptr[buff]
}

printf("ok = %d ESP = %x CS = %x \n",dwOK,dwESP,dwCS);

return 0;
}







0x003 测试环境







eq 8003f048 0000e912`fdcc0068











0x004 修改CR3







PROCESS 86311228  SessionId: 0  Cid: 059c    Peb: 7ffdf000  ParentCid: 0640
DirBase: 06d80360 ObjectTable: e17d9ac0 HandleCount: 73.
Image: 20180322_05.exe



对 

DirBase: 06d80360  进行设置



0x005 运行读取







总结: 难点很多,理解起来,模模糊糊的, 只是完成了实验, 很多还是不太懂!!





评论:
BOB
2019-07-08 20:00 回复
兄弟你这代码差了个 void 执行不过
    __declspec(naked)func()
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容