无题
回顾之前的知识,jmp 和ret retf 都不能通过调用门提权
jmp :在调用门只能在同权限跳转
ret:改变不了cs
retf:规定只能在同权限或者向低权限跳转【降权】
call:是同权限或者向高权限进行跳转【提权】
iretd:和retf 一样只能降权,但是更jb麻烦。
中断门: idt
我们看到是int 3 是e 所以它的DPL == 3 三环下可以调用 0008 是段选择值,是找的GDT
也就是:如下这个
看看int 3
调用int 3 FS会变成 30h,这些都是函数所定义的
测试:
1 | // IDT.cpp : 定义控制台应用程序的入口点。 |
找到空白的地方,很梦想这个地方是 Int 32
来填充这个:0040ee00`00081000
1 | 堆栈 |
这里用sidt来获取idt。创建了一个结构体
0x80b99400 和我们在windbg 上看到的一样
#pragma pack(1)
为什么这里需要使用这个?
因为limit 是2字节,table是4字节,内存会自动对齐,变成8字节。会出现问题,所以需要使用宏。
这样获取到的结构体就是6字节而不是对齐后的8字节。
作业:
返回一定要用iretd吗?可以使用retf吗?
构建陷阱门自己调用玩。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Safety-Blog!