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()
过滤,因为它认为你已经完成了输入。
您可以通过组合 Ctrl 和 A 到 Z 或变音符号或重音字符来键入许多代码。但是很难准确得到你想要的代码序列。
您可以试试这个:在文本编辑器中准备一个类似于您的十六进制字节的字符序列。当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 - 在调试时将十六进制值作为输入传递的主要内容,如果未能解决你的问题,请参考以下文章
TCL:变量存储一个代表浮点数的十六进制值,如何将它作为浮点数显示在屏幕上?