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

Posted

技术标签:

【中文标题】lldb - 在调试时将十六进制值作为输入传递【英文标题】:lldb - passing hex value as an input while debugging 【发布时间】:2021-12-11 12:23:17 【问题描述】:

我正在从安全角度学习 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 会话。

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

谢谢。

【问题讨论】:

您介意复制粘贴您的minimal 调试会话吗?如果您在gets() 处于活动状态时在终端上输入内容,则无法按十六进制值输入字符。您可能需要在有能力的编辑器中准备并复制它。 更新了会​​议图片。 好的,现在我们看到:它与 lldb 无关,因为它是 gets() 接受输入。最后一个n 让程序继续运行,它调用gets(),等待你输入一些东西。输入“enter”后,gets() 返回。 【参考方案1】:

您正试图通过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;

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

【讨论】:

谢谢。我明白你的意思。我没有从编辑器粘贴代码,试图在 *** 编辑器中输入它:)。非常感谢。【参考方案2】:

嗯,十六进制只是意味着你如何表示某事。通过输入 ascii 字符,您已经在编写十六进制,而不是您想要的十六进制。如果您输入 \x01 ascii,您实际上输入了 0x5C 0x78 0x31 0x32 (courtesy of one of the first ascii tables I found)。

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

【讨论】:

实际上代码是 0x5C 0x78 0x30 0x31,如转储所示...... - 如果您建议如何通过键盘输入任何字节的实际方法,如 OP 所要求,您的回答会有所帮助为。

以上是关于lldb - 在调试时将十六进制值作为输入传递的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中使用颜色十六进制值作为函数参数?

TCL:变量存储一个代表浮点数的十六进制值,如何将它作为浮点数显示在屏幕上?

在 Android Studio 中调试时默认以十六进制查看值

为啥我的 JSON 发布请求以十六进制值结束?

VsCode 执行 debug(lldb/gdb) 命令

当 String 是有效的 char 时将 String 转换为 char