首页
社区
课程
招聘
[求助]call jmp任务,jmp没问题,call却一直出现问题
发表于: 2020-7-26 18:11 3493

[求助]call jmp任务,jmp没问题,call却一直出现问题

2020-7-26 18:11
3493

昨天刚学到保护模式的TSS任务段,试验是CALL JMP实现切换任务并且能跳转回来,用jmp切换,jmp能够切换,并且跳转回来,用call就一直挂,挂到不知道重复了多少次,也找到很多帖子
!process 0 0获取 进程的Cr3
eq 8003f048 0000e913`f9ec0068
是在不知道哪里出了问题,是感觉没多少东西的,
jmp切换的时候,需要jmp跳回来,不管NT位
call切换的时候NT置为1,但只要中断了会给NT=0,所以我在里面恢复了eflag
iretd指令执行的时候会依赖eflag寄存器的NT为nT=0从堆栈里返回
NT=1的时候iretd从当前TR寄存器指向的TSS的结构的前两个字节的链接(保存上一个任务的任务段选择子),根本这个选择子可以找到切换之前的环境(我测试过)切换回去
链接jmp切换的时候不会填充,call切换的时候会自动填充,

 

我们自己构造的TSS,虽然里面有4个堆栈的ESP,SS,但是jmp call切换的时候会把esp,ss填充到esp,ss我猜测,esp0,ss0,esp1,ss1,esp2,ss2这些是用

 

#include "stdafx.h"

 

#include <Windows.h>
int valer=0;

 

char str[6]={0};
void _declspec(naked) text(){
__asm{

 

#if 1
int 3
pushfd

    pop eax 
    or eax,0x4000
    push eax
    popfd
    iretd

#else
jmp fword ptr str

 

#endif
}
}
int main(int argc, char argv[])
{ char stack[1000]={0};
char buf[6]={0,0,0,0,0,0};
((int)buf)=(int)text;
DWORD Cr3=0;
(DWORD)&buf[0]=0x12345678; (WORD*)&buf[4]=0x48;

printf("请输入当前进程Cr3的值:");
scanf("%x",&Cr3);
DWORD TSS[0x68]={
    0,
    (DWORD)stack,
    0x10,
    0,
    0,
    0,
    0,
    Cr3,                //CR3
    (DWORD)text,        //EIP
    0,                    //EFLAGE
    0x1111,                    //EAX
    0x2222,                    //EBX
    0x3333,                    //ECX
    0x4444,                    //EDX
    (DWORD)(stack)+500    ,    //ESP
    0,                    //EBP
    0,                    //ESi
    0,                    //EDI
    0x23,                //ES
    0x08,                //CS
    0x10,                //SS
    0x23,                //DS
    0x30,                //FS
    0,                    //GS
    0,                    //LDR
    0x20ac0000            //Io MAP
};        
printf("TSS=%p\n",TSS);
DWORD tr=0;
__asm{
    str eax
    mov tr,eax
}
*(WORD*)&str[4]=tr;
__asm{
    call fword ptr buf
}
printf("%p\n",valer);
getchar();
return 0;

}
这是call的试验结构
图片描述
图片描述
图片描述
最后一张图片是执行完iretd 立刻这样,这好像不是蓝屏,虚拟机一会它就自己重启了,见鬼了 Windug也不会出现终止信息,求教各位大神,这程序应该不会出现问题的啊,call jmp就是返回方式不同嘛


[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 3085
活跃值: (3623)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
你call的任务段描述符的b位是1吧
2020-7-26 19:15
0
雪    币: 167
活跃值: (876)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
Mr.hack 你call的任务段描述符的b位是1吧
对的咋了
2020-7-26 21:31
0
雪    币: 167
活跃值: (876)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
TSS中的内容都加载成功了
2020-7-26 21:51
0
雪    币: 3085
活跃值: (3623)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
call一个任务段的话,他的描述符b位必须得是0,表示这个任务段是空闲的没被使用
2020-7-27 09:44
0
雪    币: 167
活跃值: (876)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
Mr.hack call一个任务段的话,他的描述符b位必须得是0,表示这个任务段是空闲的没被使用
对确定了很多次都是没问题的,jmp  call之前0x28段选择子的b为是1,后,0x48出的描述符是的b位是1
11
2020-7-27 11:07
0
雪    币: 167
活跃值: (876)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我执行完iretd那个是蓝屏嘛,好像不是吧,windug不出出现错误信息
2020-7-27 11:08
0
雪    币: 167
活跃值: (876)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
虚拟机就重启了
2020-7-27 11:08
0
雪    币: 4
活跃值: (569)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
有点好奇啊, 任务状态段描述符的 BUSY=1 你是怎么成功切换任务的。
2020-9-10 15:47
0
游客
登录 | 注册 方可回帖
返回
//