(x64)Linux下的中断门测试

本文介绍了一个在x64 Linux环境下进行的中断门测试案例。通过编写特定的C和汇编代码,实现了从用户态到内核态的切换,并成功返回用户态。测试涉及了int3_handler函数的定义及使用,以及IDT表中int3中断描述符的修改。
摘要由CSDN通过智能技术生成

(x64)Linux下的中断门测试

code

测试代码如下:

#include <stdio.h>

// 裸函数声明,好像没什么用。。。
__attribute__((naked)) void int3_handler()
{
	//printf("___ kernel mode ___\n");
	//printf("return to UserMode!\n");
	asm("movq $0xffffffff12345678, %rax; \
		popq %rbp; \
		iretq");
}

int main()
{
	long res = 0;
	char buff[] = "haha,walker!";
	printf("buff:%s addr: %p\n", buff, buff);
	printf("int3_handler addr: %p\n", int3_handler);
	getchar();

	asm("int $0x3");
	asm("leaq %0, %%rdx; movq %%rax, (%%rdx);" : "=m"(res));
	printf("___ user mode ___\n");
	printf("Good Done! res: %p\n", res);

	return 0;
}

执行流程

测试程序的 int3_handler() 地址为 0x40105e

在这里插入图片描述


测试当前CPU.cr3指向当前测试程序:
在这里插入图片描述

可以看到,当前CPU.Cr3指向测试程序。


int3_handler()测试函数的反汇编代码如下,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


当修改IDT表中的int3中断描述符后,将异常处理例程指向测试函数 int3_handler()。
当执行测试函数时,cs处于内核态下,通过汇编指令 iretq 返回用户态。

push   %rbp				 	# 函数包装,此处未实现裸函数
mov    %rsp,%rbp
movabs $0xffffffff12345678,%rax
pop    %rbp					# 恢复rbp,实现栈平衡
iretq  						# 返回用户态
# pop    %rbp				# --------------------- 以下指令不会执行
# retq   


构造中断门

在 int3_handler() 函数处下断点,并修改idt中断门描述符

(gdb) b *0x40105e		# 在int3_handle()函数处下断点
Breakpoint 1 at 0x40105e
(gdb) p idt_table		# 内核全局变量, 指向idt表
$1 = 0xffffffff8082b000

在这里插入图片描述


构造中断门描述符:0x0010105e, 0x0040ee04 0x00000000, 0x00000000

在这里插入图片描述

中断在内核态

继续执行程序,程序执行int3指令中断在int3_handler()函数处:
在这里插入图片描述
此时,cs/ds/ss均处于内核态。


在这里插入图片描述
此时 rsp 栈顶的5个元素依次为:rip、cs、eflags、rsp、ss。
cs和ss的DPL均为3,即中断来自用户态,rip为0x4010e0,rsp=0x00007fffef3de120。


在这里插入图片描述



返回用户态

当指向汇编指令 iretq 时,将返回用户态。

在这里插入图片描述


成功获取返回值!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值