C 如何使64位应用程序缓冲区溢出?

C 如何使64位应用程序缓冲区溢出?,c,64-bit,buffer,buffer-overflow,C,64 Bit,Buffer,Buffer Overflow,首先我想说的是,我已经在网上搜索过了,还没有找到任何有价值的东西。我这里有一个非常简单的标准BOF文件要攻击。我以64位模式编译了它: #include <stdio.h> #include <string.h> int main(int argc, char **argv) { if(argc!=2) return 1; char buffer[500]; strcpy(buffer, *(argv+1)); //vulnerable fun

首先我想说的是,我已经在网上搜索过了,还没有找到任何有价值的东西。我这里有一个非常简单的标准BOF文件要攻击。我以64位模式编译了它:

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    if(argc!=2) return 1;
    char buffer[500];
    strcpy(buffer, *(argv+1));  //vulnerable function
    return 0;
}
现在,如果我添加了
-m32
,那么溢出是非常容易的,我已经习惯了。但是,覆盖RIP似乎是不可能的

gdb-q输出


寄存器值:

(gdb) info reg
rax            0x0  0
rbx            0x0  0
rcx            0x400659 4195929
rdx            0x7ffff7dd8e10   140737351880208
rsi            0x7ffff7ff8000   140737354104832
rdi            0x0  0
rbp            0x4141414141414141   0x4141414141414141
rsp            0x7fffffffe578   0x7fffffffe578
r8             0x1  1
r9             0x4141414141414141   4702111234474983745
r10            0x0  0
r11            0x7ffff7acea40   140737348692544
r12            0x400440 4195392
r13            0x7fffffffe650   140737488348752
r14            0x0  0
r15            0x0  0
rip            0x40059e 0x40059e <main+82>
eflags         0x10206  [ PF IF RF ]
cs             0x33 51
ss             0x2b 43
ds             0x0  0
es             0x0  0
---Type <return> to continue, or q <return> to quit---
fs             0x0  0
gs             0x0  0
(gdb)
(gdb)信息注册
rax 0x0 0
rbx 0x0 0
rcx 0x400659 4195929
rdx 0x7ffff7dd8e10 140737351880208
rsi 0x7FF7FF8000 140737354104832
rdi 0x0
rbp 0x4141 0x4141
rsp 0x7FFFFFE578 0x7FFFFFE578
r8 0x1 1
r9 0x414141470211123447474744983745
r10 0x0 0
r11 0x7ffff7acea40 140737348692544
r12 0x400440 4195392
r13 0x7FFFFFE650 140737488348752
r14 0x0 0
r15 0x0 0
rip 0x40059e 0x40059e
eflags 0x10206[PF IF RF]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
---键入以继续,或键入q以退出---
fs 0x0 0
gs 0x0 0
(gdb)
似乎几乎没有在线文档可以让我学习如何使用64位应用程序

在strcpy函数之后直接设置断点时,我发现参数的末尾在RCX寄存器中。

查找并
Reading symbols from /Files/ASM/a.out...done.
(gdb) run $(python -c 'print "A"*100')
Starting program: /Files/ASM/a.out $(python -c 'print "A"*100')
You said:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Program received signal SIGSEGV, Segmentation fault.
0x000000000040059e in main (argc=2, argv=0x7fffffffe658) at vuln.c:10
10  }
(gdb) 
(gdb) info reg
rax            0x0  0
rbx            0x0  0
rcx            0x400659 4195929
rdx            0x7ffff7dd8e10   140737351880208
rsi            0x7ffff7ff8000   140737354104832
rdi            0x0  0
rbp            0x4141414141414141   0x4141414141414141
rsp            0x7fffffffe578   0x7fffffffe578
r8             0x1  1
r9             0x4141414141414141   4702111234474983745
r10            0x0  0
r11            0x7ffff7acea40   140737348692544
r12            0x400440 4195392
r13            0x7fffffffe650   140737488348752
r14            0x0  0
r15            0x0  0
rip            0x40059e 0x40059e <main+82>
eflags         0x10206  [ PF IF RF ]
cs             0x33 51
ss             0x2b 43
ds             0x0  0
es             0x0  0
---Type <return> to continue, or q <return> to quit---
fs             0x0  0
gs             0x0  0
(gdb)