【发布时间】:2020-12-08 05:42:41
【问题描述】:
所以我最近对缓冲区溢出感兴趣,许多在线教程和资源都有这种类似 CTF 的攻击,您需要读取标志文件的内容(例如使用 cat)。
所以我开始在网上寻找有关如何执行此操作的组装示例,然后我访问了诸如 this 或 shell-storm 之类的网站,其中有很多关于如何执行此操作的示例。
所以我生成了我的漏洞利用并得到了这个机器代码(它基本上执行了一个执行 cat 标志的 shell):
shellcode = b'\x31\xc0\x50\x68\x2f\x63\x61\x74\x68\x2f\x62\x69\x6e\x89\xe3\x50\x68\x66\x6c\x61\x67\x89\xe1\x50\x51\x53\x89\xe1\x31\xc0\x83\xc0\x0b\xcd\x80'
问题在于,由于使用 GDB 调试问题,我注意到我的缓冲区没有被复制到 shell 代码末尾以 \x0b 开始。我知道问题就在那里,因为如果我将其更改为 \x3b 则它可以工作(我的其余漏洞未在此处复制)即使它明显在它达到错误值时崩溃但在至少整个缓冲区被复制。现在做一些研究,似乎 \x0b 是一个“坏字符”,可能会导致问题,应该避免。话虽如此,我不明白如何:
-
所有在线甚至大学教程都使用该 shell 代码 为这个确切的任务。
-
如何解决这个问题。有没有可能完全不 改汇编代码?
我会补充一点,我在 Ubuntu 上并尝试在 64 位上进行这项工作。
【问题讨论】:
-
据我所知,0xb 不是有问题的字符,但它取决于哪些函数进行复制。您可以使用编码中没有 0xb 的指令来解决它(例如,让 0xb 使用 0xa 和
inc或其他类似的算术/逻辑技巧)。 -
这个 shellcode 用于什么 ISA? AArch64? RISC-V64? x86-64?避免机器代码中某些字节的技术显然在很大程度上取决于 ISA。您应该将 [security] 标签替换为 x86-64 或任何合适的标签。
-
正如 Margaret 所说,查看将您的漏洞利用数据复制到太小的缓冲区中的易受攻击的代码。它的停止条件是什么?如果它类似于
strcpy,那么除\0之外的任何字符都可以,这可能是您的消息来源想要利用的那种漏洞。如果是scanf("%s",...)之类的,那么遇到空格就会停止,\x0b是 ASCII 中的空格字符(垂直制表符)。因此,如果这就是您要利用的内容,那么是的,您需要重写代码以避免任何作为空白字符的字节。 -
有时这可以通过细微的调整来完成,有时它可能需要像你说的那样“完全改变”。真的不一样。
-
如果您将尝试利用的代码添加到您的问题中,您可能会得到更具体的答案。
标签: security assembly buffer-overflow exploit shellcode