我有一个具有经典strcpy
漏洞的代码片段
int main(int argc, char argv[][]){
char buffer[8];
strcpy(buffer, argv[1]);
}
通过反汇编二进制文件,我们可以看到rsp
减少了0x10
字节(=16
)
所以我们实际上可以覆盖rbp
16 字节后的地址,并在 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。我应该在这里做什么?
这是我的想法:
使用猎蛋方法。但是,我无法向应用程序发送超过 24 字节的数据,因为返回地址包含空字节,它终止了我的 shellcode。
为 64 位 Linux 查找小于 24 字节的 shellcode。(我想这是不可能的)
ROP 方法,但是,启用了 ASLR,我无法弄清楚 libc 的基地址
我已经阅读了许多教程,其中大多数都有一个很大的缓冲区,char buffer[500]
例如char buffer[8]
。如果有人能引导我到正确的地方,那就太好了。