c - 如何将输入发送到 gdb 中的附加进程?
问题描述
问题
我有一个名为scan
(见代码部分)的测试程序,我在一个终端中运行。程序开始运行并要求用户输入一个字母:
$ ./scan
Enter a letter
在另一个终端窗口中,我运行 gdb 并附加到scan
进程:
$ sudo gdb -p `pidof scan`
(gdb)
我想将一个称为payload
输入的二进制文件的内容发送到scan
进程。附加进程时如何在 gdb 中完成此操作?这可能吗?
背景
我想附加到scan
进程,因为我想在运行时检查程序的 ASLR 地址空间。如果我直接使用 gdb ( $ gdb scan
) 运行该进程,gdb 会关闭 ASLR 并获得一致的寻址。
例如,scan
直接使用 gdb 运行(请注意,这...
是截断的输出):
$ gdb scan
(gdb) info functions
...
0x00000000000005a8 _init
0x00000000000005d0 __stack_chk_fail@plt
0x00000000000005e0 printf@plt
0x00000000000005f0 __isoc99_scanf@plt
...
上面显示的地址每次我这样运行gdb都是一样的,说明gdb关闭了ASLR。但是,当附加到进程时,地址总是会改变。一次运行:
$ sudo gdb -p `pidof scan`
(gdb) info functions
...
0x00005598706305a8 _init
0x00005598706305d0 __stack_chk_fail@plt
0x00005598706305e0 printf@plt
0x00005598706305f0 __isoc99_scanf@plt
在另一次运行中:
0x000055813ccf65a8 _init
0x000055813ccf65d0 __stack_chk_fail@plt
0x000055813ccf65e0 printf@plt
0x000055813ccf65f0 __isoc99_scanf@plt
该文件payload
包含一个二进制有效负载。我知道如何在正常运行 gdb 时(例如(gdb) run < payload
)发送文件内容作为输入,但在使用附加进程运行时不知道。
我不想将这些文件内容复制/粘贴到正在运行的终端中scan
。我也不想关闭 ASLR。
我尝试过/读过的东西
我已阅读gdb 手册和 gdb 帮助命令:
(gdb) help
(gdb) help target
(gdb) help attach
(gdb) help obscure
其他 StackOverflow 问题不会询问有关将输入发送到附加进程的问题:
代码
我的整个scan
程序是这样的:
#include <stdio.h>
int main(int argc, char **argv)
{
char letter[1];
char buffer[8];
printf("Enter a letter: ");
int result = scanf("%s", letter);
printf("You entered: %s\n", letter);
}
解决方案
推荐阅读
- c# - 为什么这个 IQueryable 问题会给我一个错误?
- javascript - 如何将滑动切换按钮添加到制表符列中的每个单元格
- firebase - 可以存储在firebase上的最大数值是多少?
- c - C 标准的哪些部分证明了整数类型大小之间的关系?
- file - 如何在 COBOL 中删除前导零和尾随空格
- android - Android 如何为 GL_TEXTURE_EXTERNAL_OES 生成 mipmap
- jquery - JAVA JPA SPRING - IncorrectResultSizeDataAccessException:查询未返回唯一结果:2
- python - 如何将 RNN 与 CNN 结合起来
- python - 从 Logic for Dataframe 创建函数
- jmeter - 我对 Jmeter 线程组部分有疑问