一、基础

1.1 汇编

1.1.1 汇编指令

push指令(数据的入栈)

image-20231103163107041

作用:

  1. 将当前的数据存到下一个位置(注意不是当前ESP的位置)
  2. 将ESP进行压栈(入栈、进栈),也就是ESP值 - 4

pop指令(数据的出栈)

image-20231103164141166

作用:

  1. 将当前ESP中的数据取出到指定寄存器
  2. 将ESP进行出栈,也就是ESP值 + 4

call指令(按f7可以进入函数内部):

image-20231103162342011

作用:

  1. 跳转到地址位置,这里是1F1307
  2. 当前位置1F197Apush到ESP堆栈区(方便后面ret)

附:call调用的流程分析

image-20231103174119000

lea指令

image-20231103170927765

作用:

  1. 将[]内的值地址值赋值给edi,不是对应地址上的值

1.2 内存管理

我们用C语言和C++申请空间用的mallocnew,这两个底层调用的都是heapAlloc这个api,这个api是属于3环的api。还有我们熟知的VirtualAlloc,也是属于3环的api。

kernel32.dllntdll.dll使用非常频繁,几乎所有的exe都会去调。

我们会遇到这样一个情况,就是当多个程序同时去访问dll中的某个api时,会产生冲突。windows为了解决这个问题,处理方式是,在每个程序运行时,拷贝一份dll到它的内存空间中。这里的拷贝,就是我们说的程序运行时,程序到内存中的映射。

1.3 windows系统调用

3环进0环就是系统调用。

x86系统下,3环进入0环有3种方式。

  • sysenter 快速调用-》KiFastSystemCall
  • int2E 中断门-》KiIntSystemCall

最高位0-7就是在3环,8-F就是在0环


0环中的SSDT表,即系统服务描述符表,存储的是真正0环函数的实现地址。

1
kd> dd KeServiceDescriptorTable //dd看内存,dt看结构

硬件断点

asmi绕过

DLL劫持(白加黑)

  1. 利用dumpbin查看exe需要的dll导出函数
1
dumpbin import "1.exe"
  1. dll导出所需函数
1
extern "C" __declspec(dllexport) void WTSFreeMemory(){}

注意:我们用的时候,尽量不要找微软的dll,尽量用厂商自己的dll,这里有一个网站,可以查看公开的厂商的dll,HijackLibs

UAC白名单挖掘

需要满足以下三个条件

1
2
3
1. 程序的manifest标识的配置属性 autoElevate 为 true
2. 程序不弹出UAC弹窗
3. 从注册表里查询Shell\Open\command键值对