lldb - 在调试时将十六进制值作为输入传递

lldb - passing hex value as an input while debugging

我正在从安全角度学习 lldb。我正在尝试在下面的示例代码中执行缓冲区溢出。

#include<stdio.h>
void return_input(void) {
char array[30];
gets(array);
printf("%s\n", array);
}

int main(){
return_input();
return 0
}

gets函数是这里的目标。

在 lldb 控制台中,我需要键入将覆盖 return 地址的长字符串。如果我尝试像这样的字符串, (lldb) AAAAAAA\x01\x02 它们被视为单独的字符而不是十六进制值。

如何在 LLDB 会话 中传递 十六进制值作为输入?基本上,我正在尝试覆盖内存。

还有其他答案,我们将字符串作为参数传递,但我想在会话中自己键入数据。

正在更新 lldb 会话。

在下图中,您可以看到十六进制实际上已转换为字符串

谢谢。

好吧,十六进制只是表示您如何表示某物。通过键入 ascii 字符,您已经在编写十六进制,而不是您想要的十六进制。如果您输入 \x01 ascii,您实际输入的是 0x5C 0x78 0x31 0x32 (courtesy of one of the first ascii tables I found ).

你应该做逆过程。如果要键入 0x01 0x2,则必须输入 SOX 和 STX 符号。

您正试图通过 gets() 向变量 array 及以后输入任意字节。这不是直截了当的,而且部分不可能,因为标准输入流和 gets() 通常不会获取所有代码并过滤一些代码。

例如,如果您想在输入中输入字节 0x0D(或 0x0A,取决于您的终端),您可以尝试键入 Enter。但是这个键会被 gets() 过滤,因为它认为您已经完成了输入。

您可以键入许多代码,通过 CtrlAZ 的组合或变音符或重音字符。但是很难准确得到你想要的代码序列。

您可以试试这个:在文本编辑器中准备一个类似于十六进制字节的字符序列。当 gets() 需要您的输入时,将它们复制到控制台。

要查看哪个字符产生什么代码,请考虑编写一个小的实验程序来调用 gets() 并打印接收到的代码:

#include <stdio.h>

int main(void) {
    char line[30];
    gets(line);
    for (int i = 0; i < sizeof line; ++i) {
        printf("%d: %X\n", i, line[i]);
    }
    return 0;
}

注意:请采用一种代码风格并坚持下去。您的来源根本没有缩进。