【问题标题】:return to libc attack using a function pointer使用函数指针返回 libc 攻击
【发布时间】:2017-06-22 13:24:15
【问题描述】:

我应该如何格式化我的输入以在以下代码中返回 libc 攻击:

void example_function(int x, const char *name)
{
    void (*foo)(int, const char *) = http_serve_none;
    char buf[1024];

    sprintf(buf, name);

    foo(x, buf);
}

鉴于堆栈是不可执行的。我想通过在 libc 中更改指向系统的 foo 函数指针而不是通过更改 example_function 的返回地址来返回 libc 攻击。到目前为止我所做的是使用常规方法进行输入:

padding + 系统地址(在 foo 函数的地址)+ 的地址 exit + ptr to string ( string = "/bin/sh" )

但这不起作用。我不知道如何在系统调用的输入字符串中格式化我的参数。我在互联网上搜索了很多,但到处都看到只使用返回地址调用 system()。

额外假设:

系统调用地址中没有“0”。机器是 32 位的,并且 sprintf 工作正常,即将名称存储到缓冲区 buf[1024] 中。

【问题讨论】:

  • 上课吗?

标签: security buffer-overflow libc exploit shellcode


【解决方案1】:

我终于解决了...我只是将指针传递给 x 地址的字符串“/bin/sh”,它对我有用

【讨论】:

    【解决方案2】:

    首先,确保您的sprintf 实际上是sprintf 而不是__sprintf_chk,这将试图阻止您的溢出。你可以说它是强化版本,因为你会得到一个 SIGABRT 而不是其他东西(比如 SIGSEGV)。您可以全局关闭强化,但您也可以避免使用以下宏:

    (sprintf)(buf, name);
    

    您的下一个问题是零。如果system 的地址中有任何零字节,那么sprintf 将在该点停止复制。这既是“嗯,有很多 64 位地址都带有零”,而且是故意的。它被称为 ASCII 装甲,在某些平台上,重要的 libc 函数确保其中包含零,以完全阻止这种攻击。 (请参阅Writing a return-to-libc attack, but libc is loaded at 0x00 in memory 了解更多信息。)

    您可能想在您的程序(即不是 libc)中使用您已确保其中没有零的函数来探索这种攻击。如果您为 32 位构建,这会更容易一些。当然,您可能希望关闭强化和堆栈保护以及编译器正在执行的所有其他操作以阻止此操作:D(至少在您有一个基本版本工作之前;然后您可以在一个时间)。

    【讨论】:

    • 我现在已经在问题中澄清了这些事情。请告诉我如何在 libc 中调用 system() 以使用 foo() 执行 shellcode
    • 代码应该很短,所以你应该可以发布它。说出“不起作用”的意思也很重要。它会崩溃吗?在哪里以及如何?在上面运行调试器。 name 和 foo 在执行之前的值是多少?
    • 有效载荷中是否有零?请记住,此时它将停止复制。
    • (你已经关闭了 ASLR,对吗?否则system() 不是你认为的位置。)
    • ASLR 已关闭,我的有效载荷中没有 0
    猜你喜欢
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2018-03-07
    • 2018-08-19
    • 2011-12-06
    相关资源
    最近更新 更多