实验环境

虚拟机添加串口:\\.\pipe\com_1
image.png

打开C盘下的boot.ini,添加如下内容:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional Debug" /noexecute=optin /fastdetect /debugport=COM1 /baudrate=115200
image.png

在windbg的快捷方式中添加一下内容:
D:\anquan\CTF-tools\RE\windbg\windbg_cn_6.11.0001.404.exe -b -k com:pipe,port=\\.\pipe\com_1,baud=115200,resets=0 -y SRV*D:\anquan\symbol*http://msdl.microsoft.com/download/symbols
image.png

实验1:中断提权

中断描述表

idt 就是中断描述表,idtr 就是中断描述表寄存器,用来记录 idt 在什么地方

windbg命令
**
r eax 就是看一下 eax 的内容

dq 地址 L140 查看地址的内容,后面跟一个 L 可以查看的长度,也就是 range

使用 eq 8003f500 0040ee0000081000<br />把 0040ee0000081000 写到 8003f500 的地方

实验开始

使用命令 r idtr 查看中断描述表寄存器,找到中断表的位置
得到:idtr=8003f400
使用 dq ``8003f400 -L40 查看中断描述表
会看到 80548e00`000831a0 等这些差不多的,其实真正的是两边那8个,805431a0,中间的是一些属性,后面再说

image.png

我们要做的就是:用程序写一个函数,他会去触发中断,一旦执行中断之后就可以执行异常,异常的处理地址就是我们用 eq 写入的,触发异常之后就可以执行高权限的命令了

具体做法是构造一个裸函数,这个裸函数是我们用来执行高权限代码的地方,这个函数的入口就是 401000

  1. void _declspec(naked) IdtEntry()
  2. {}

使用 eq 8003f500 0040ee0000081000`
把 00401000 写到 8003f500 的地方(这里注意应该是 ee 而不是 8e,否则用户态的进程是没法访问的)
ee 与 e8 的区别是 ee 允许用户态来触发,而 e8 只允许内核态

image.png

对于普通的 int 3 断点,直接在代码里面就可以执行,它的前半部分是 ee00,如果是 e800的就不行

image.png

写一个函数,把函数的地址塞到向量表里面,使用裸函数

然而每次运行地址都是不一样的,在属性里面把随即地址关了填上一个固定地址

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<Windows.h>
  4. DWORD g_temp=0;
  5. void _declspec(naked) IdtEntry()
  6. {
  7. _asm{
  8. mov eax,dword ptr ds:[0x8003f014]
  9. mov g_temp,eax
  10. iretd
  11. }
  12. }
  13. void go()
  14. {
  15. _asm int 0x20
  16. /*这个地方,就涉及到属性了,要是 int 3 的话,因为属性 ee00 是允许 ring 3 也就是用户访问的,所以会提示触发了一个断点,如果是 int 0 的话就属于你是用户态却想访问内核态的东西 8e00,会报错,当正常出现这个异常的时候是由硬件访问这个地址的 */
  17. }
  18. void main()
  19. {
  20. if((DWORD)IdtEntry != 0x401000)
  21. {
  22. printf("%p\n",IdtEntry);
  23. exit(-1);
  24. }
  25. go();
  26. printf("%p\n",g_temp);
  27. system("pause");
  28. }

tips:release 版本的如果有的没用的话,会默认优化掉不生成
如果在 XP 上显示不是有效的 win32 => 右键项目 => 属性 => 配置属性 => 常规 => 平台工具集 => 选择 XP 的

实验2:多核复杂性

image.png

默认CE是不会打开这个功能的,需要在设置->其他->勾上全部选项再重启

image.png