hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md

5.6 KiB
Raw Blame History

栈溢出

从零开始学习AWS黑客技术成为专家 htARTEHackTricks AWS Red Team Expert

支持HackTricks的其他方式

什么是栈溢出

栈溢出是一种漏洞,当程序向栈写入的数据超过其分配的空间时发生。这些多余的数据将覆盖相邻的内存空间,导致有效数据的损坏,控制流的中断,以及潜在地执行恶意代码。这个问题通常是由于使用不执行输入边界检查的不安全函数而引起的。

这种覆盖的主要问题在于EIPEBP指针用于返回到前一个函数的位置是存储在栈中的。因此,攻击者可以覆盖这些指针并控制程序的执行流

这种漏洞通常是因为一个函数在栈内复制的字节数超过了为其分配的数量,因此能够覆盖栈的其他部分。
一些常见的易受攻击的函数包括:strcpystrcatsprintfgetsfgets...

例如,以下函数可能存在漏洞:

void vulnerable() {
char buffer[128];
printf("Enter some text: ");
gets(buffer); // This is where the vulnerability lies
printf("You entered: %s\n", buffer);
}

寻找栈溢出

发现栈溢出最常见的方法是提供一个非常大的A输入(例如python3 -c 'print("A"*1000)'),并期望出现Segmentation Fault,表明尝试访问地址0x41414141

此外,一旦发现存在栈溢出漏洞,就需要找到偏移量,直到可以覆盖EIP指针,为此通常使用De Bruijn序列。对于大小为_k_的字母表和长度为_n_的子序列De Bruijn序列是一个循环序列其中长度为_n_的每个可能子序列恰好出现一次作为一个连续的子序列。

这样不需要手动找出哪个偏移量正在覆盖EIP可以使用这些序列之一作为填充然后找到最终覆盖它的字节的偏移量。

可以使用pwntools来实现:

from pwn import *

# Generate a De Bruijn sequence of length 1000 with an alphabet size of 256 (byte values)
pattern = cyclic(1000)

# This is an example value that you'd have found in the EIP/IP register upon crash
eip_value = p32(0x6161616c)
offset = cyclic_find(eip_value)  # Finds the offset of the sequence in the De Bruijn pattern
print(f"The offset is: {offset}")

或者 GEF

#Patterns
pattern create 200 #Generate length 200 pattern
pattern search "avaaawaa" #Search for the offset of that substring
pattern search $rsp #Search the offset given the content of $rsp

利用堆栈溢出

在溢出时(假设溢出大小足够大),您将能够覆盖堆栈内其他变量的值,直到达到 EBP 和 EIP甚至更多
滥用这种类型漏洞最常见的方式是通过修改 EIP 指针,这样当函数结束时,控制流将被重定向到用户在此指针中指定的位置

然而,在其他情况下,也许只是覆盖堆栈中一些变量的值就足以进行利用(就像在简单的 CTF 挑战中一样)。

Ret2win

在这种类型的 CTF 挑战中,二进制文件中有一个函数从未被调用您需要调用它才能获胜。对于这些挑战,您只需要找到覆盖 EIP 的偏移量,并找到要调用的函数的地址(通常会禁用 ASLR),这样当有漏洞的函数返回时,隐藏函数将被调用:

{% content-ref url="ret2win.md" %} ret2win.md {% endcontent-ref %}

Ret2Shellcode

保护类型

{% content-ref url="../common-binary-protections/" %} common-binary-protections {% endcontent-ref %}

从零开始学习 AWS 黑客技术,成为专家 htARTEHackTricks AWS 红队专家)

支持 HackTricks 的其他方式: