64 位机器上 shellcode 的有限缓冲区大小

信息安全 缓冲区溢出 aslr
2021-08-13 01:45:44

我有一个具有经典strcpy漏洞的代码片段

int main(int argc, char argv[][]){
    char buffer[8];
    strcpy(buffer, argv[1]);
}

通过反汇编二进制文件,我们可以看到rsp减少了0x10字节(=16

所以我们实际上可以覆盖rbp16 字节后的地址,并在 24 字节后返回地址。在函数返回之前,rax是指向我们shellcode的开始。

这是我攻击程序的方法。我们的shellcode将采用以下格式

"A"*16 + "B"*8 + "C"*8

由于启用了 ASLR,我将返回地址替换为 的地址jmpq *%rax,因此有效负载现在将变为

"A"*16 + "B"*8 + "\x77\x04\x40"

通过在 gdb 中单步执行,我可以看到执行被定向到“A”的开头。但是,缓冲区太小而无法放入 ( system(/bin/sh)) shellcode。我应该在这里做什么?

这是我的想法:

  1. 使用猎蛋方法。但是,我无法向应用程序发送超过 24 字节的数据,因为返回地址包含空字节,它终止了我的 shellcode。

  2. 为 64 位 Linux 查找小于 24 字节的 shellcode。(我想这是不可能的)

  3. ROP 方法,但是,启用了 ASLR,我无法弄清楚 libc 的基地址

我已经阅读了许多教程,其中大多数都有一个很大的缓冲区,char buffer[500]例如char buffer[8]如果有人能引导我到正确的地方,那就太好了。

1个回答

解决这个问题有多种可能的方法,这只是创造性的问题。

以下是您可以尝试的一些事情:

  • 如果您知道当前 libc 的版本,则可以找到一个具有满足您寄存器值的约束的单一小工具。

  • strcpy()此外,如果您知道当前 libc 的版本,则应该有足够的大小用于覆盖GOT 条目指向的最低有效字节的小 shellcode system()

  • 您可以在这里使用一个不错的 23 字节长 64 位 Linux shellcode:https ://www.exploit-db.com/exploits/46907 。

  • 根据此二进制文件的编译方式,可能有足够的小工具供您构建第一阶段 ROP 链,该链会增加缓冲区大小,然后再跳回以strcpy()从堆栈中获取剩余的有效负载。

我希望这几个例子能阐明你在这里拥有的无限可能性。