1.裸函数

1
2
3
4
5
6
7
void __declspec(naked) test()
{
__asm
{
ret;
}
}

裸函数就是不让编译器进行自动填充的内容。
每个函数之间都有间隔,如果裸函数中间不添加任何东西,就会报错。因为被调用的时候会跳到俩个函数之间的间隔:CC CC

2.段权限规则 代码段 数据段 堆栈

R0 :操作系统内核层,调度硬件资源管理

1环 2环:现在已经舍弃,但他们是接口层,执行体,操作系统服务层

3环:应用层

硬件资源就规划好了,段就是资源的划分,资源被划分也就是权限被划分了。
CS段和SS段 这2个段的权限则可以说明,处于R0还是R3。所以在提权的时候,需要将CS和SS一起都改了。
看权限的话,看一个即可。

image-20241114214834398

image-20241114211527485

DPL:Descriptor privilege level 描述权限等级

CPL:Current privilege level 当前权限等级

RPL:request privilege level,请求权限等级(可以乱给)

普通数据段下,RPL没有效果
堆栈段 (SS) RPL == CPL == DPL 才能更改
代码段(CS)CPL == DPL

练习:
首先连接器->高级->随机地址禁用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
void __declspec(naked) test()
{
__asm
{
ret;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("%x\r\n",test); //0x411082
char bufcode[6] = {0,0,0,0,0x48,0};
*(int *)&bufcode[0] = (int)test;
__asm
{
push biaoqian
//jmp far bufcode
jmp fword ptr bufcode
biaoqian:
}

return 0;
}

利用这个代码可以将CS改成= 004B

jmp far 到底是什么?为什么0x48 -> 0x4b 呢?

你可能会问:为什么呢?

此过程中,段选择器的值并不直接被赋值给 CS 寄存器,而是经过计算或解析后确定的段属性被加载到 CS 中。

&F8。不懂就去看2.段探测