首先,我想说我已经在线查看并且还没有找到任何有价值的东西。我这里有一个非常简单,标准的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;
}
编译:
gcc -fno-stack-protector -ggdb -z execstack -o output vulnerable.c
现在,如果我添加了-m32
,那么溢出很容易,而且我已经习惯了。但是,似乎无法覆盖 RIP 。
gdb -q output
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)
在线似乎几乎没有文档,我可以从中学习BOFing 64位应用程序。
在strcpy函数后直接设置断点时,我发现参数的结尾位于 RCX 寄存器中。