Radare2 无法正确重新加载有效载荷

逆向工程 雷达2
2021-07-11 02:06:57

我是 Radare2 的新手,所以我试图通过做一些基本的缓冲区溢出来学习它。我的问题是,当我尝试加载一些有效载荷时,堆栈似乎以一些不同的方式伪造它们......

例如,尝试通过调用一个简单的 python 脚本来加载输入

import struct

def p (x):
    return struct.pack('<I',x)

param = ""
param += "A"*30

param += p(0xb7e40db0)
param += p(0xb7e349e0)
param += p(0xb7f61b0b)

print param

并使用它来运行它。

r2 -d bufferoverflow `python payload.py`

溢出时我得到这个堆栈。

在此处输入图片说明

我用这种方式运行它不会遇到任何问题

但是,当我设置了一些断点,自定义了一些视图以更加舒适时,我尝试使用 Radare2 中的“dor”和“doo”命令重新加载文件

在此处输入图片说明

但现在 Radare2 似乎开始用一些随机值伪造堆栈......

在此处输入图片说明

我不确定这是我的问题,因为我做错了,还是由我不知道的 Radare2 行为引起的。

在此处输入图片说明

1个回答

我认为这是预期的行为,因为这种正常模式(没有值前缀 - 见下文)可能对 ascii 参数有效。在这里,您正在传递一个可能包含 ascii 控制字节的有效负载,并且可能会导致问题。

从损坏的有效载荷中可以清楚地看出,缺少一个字节0x0d,这导致了您的问题。但是为什么不见了呢?

让我们看看从 rarun2 配置文件(dor在这种情况下基本上是从命令)设置新进程值的代码

正在使用以下代码 ( libr\socket\run.c)解析配置文件

R_API bool r_run_parse(RRunProfile *pf, const char *profile) {
    r_return_val_if_fail (pf && profile, false);
    char *p, *o, *str = strdup (profile);
    if (!str) {
        return false;
    }
    r_str_replace_char (str, '\r',0); // <------ (1)
    p = str;
    while (p) {
        if ((o = strchr (p, '\n'))) {
            *o++ = 0;
        }
    r_run_parseline (pf, p);
    p = o;
    }
    free (str);
    return true;
}

str是我们的 rarun2 配置文件(传递给 的内容dor)而 char'\r'实际上是0xd. 在将它传递给r_run_parseline解析和设置流程环境变量(如 args)之前,它已从第 (1) 行的输入中删除

不知道为什么这条线在那里 - 可能是为了统一行尾?(Windows/Linux)

可以做些什么来克服这个问题?修改您的脚本并使用值前缀之一。如果您的脚本而不是原始字节打印十六进制字符串,您可以使用:它来解析它并正确传递给您的程序。所以改变你的脚本来打印这样41414141.....

然后从r2use:指示输入是一个十六进制对字符串。

dor arg1=:`!python payload.py`
doo