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 运行读取
总结: 难点很多,理解起来,模模糊糊的, 只是完成了实验, 很多还是不太懂!!