Security 使用函数指针返回libc攻击

Security 使用函数指针返回libc攻击,security,buffer-overflow,libc,exploit,shellcode,Security,Buffer Overflow,Libc,Exploit,Shellcode,我应该如何在以下代码中设置返回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_函数的返回地

我应该如何在以下代码中设置返回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_函数的返回地址来执行返回libc攻击。到目前为止,我所做的是使用传统方法进行输入:

填充+系统地址(在foo函数的地址)+的地址 退出+ptr到字符串(字符串=“/bin/sh”)

但无论如何,这是行不通的。我不知道如何在系统调用的输入字符串中设置参数的格式。我在网上搜索了很多,但到处都能看到只使用返回地址调用system()

额外假设:


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

首先,确保您的
sprintf
实际上是
sprintf
而不是
\u sprintf\u chk
,这将试图阻止溢出。你可以看出这是强化版,因为你会得到一个SIGABRT而不是其他东西(比如SIGSEGV)。您可以在全局范围内关闭强化功能,但也可以通过以下方式避免使用宏:

(sprintf)(buf, name);
你的下一个问题是零。如果
system
的地址中有任何零字节,则
sprintf
将在该点停止复制。这既是“好吧,有很多64位地址中有零”,也是故意的。这被称为ASCII铠装,在某些平台上,重要的libc函数中确保有零,以准确地阻止这种攻击。(更多信息请参见。)


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

我终于解决了这个问题。。。我刚刚在x的地址传递了字符串“/bin/sh”的指针,它对我有效

我现在已经在问题中澄清了这些事情。请告诉我如何在libc中调用system()来使用foo()执行外壳代码。代码应该非常短,因此您应该能够发布它。说出“不起作用”的意思也很重要。它会崩溃吗?在哪里,如何?对其运行调试器。name和foo在执行之前的值是多少?负载中是否有零?请记住,它将在该点停止复制。(您已经关闭了ASLR,对吗?否则,
system()
不是您认为的位置。)ASLR已关闭,并且在我的payloadhw中没有类的0?