C 如何向gdb中的附加进程发送输入? 问题:

C 如何向gdb中的附加进程发送输入? 问题:,c,linux,debugging,gdb,C,Linux,Debugging,Gdb,我有一个名为scan(参见代码部分)的测试程序,我在一个终端上运行。程序开始运行并要求用户输入一个字母: $ ./scan Enter a letter 在另一个终端窗口中,我运行gdb并连接到扫描过程: $ sudo gdb -p `pidof scan` (gdb) 我想将名为payload的二进制文件的内容作为输入发送到scan过程。当流程被连接时,我如何在gdb中实现这一点?这可能吗 背景 我想附加到扫描进程,因为我想在运行时检查程序的ASLR地址空间。如果我直接用gdb($gdb

我有一个名为
scan
(参见代码部分)的测试程序,我在一个终端上运行。程序开始运行并要求用户输入一个字母:

$ ./scan
Enter a letter
在另一个终端窗口中,我运行gdb并连接到
扫描过程:

$ sudo gdb -p `pidof scan`
(gdb)
我想将名为
payload
的二进制文件的内容作为输入发送到
scan
过程。当流程被连接时,我如何在gdb中实现这一点?这可能吗

背景 我想附加到
扫描
进程,因为我想在运行时检查程序的ASLR地址空间。如果我直接用gdb(
$gdb scan
)运行该进程,gdb将关闭ASLR,我将获得一致的寻址

例如,直接使用gdb运行
scan
(请注意,
是截断输出):

每次我以这种方式运行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
文件
有效载荷
包含一个二进制有效载荷。我知道在正常运行gdb时(例如,
(gdb)run
)如何将文件内容作为输入发送,但在使用附加进程运行时则不知道如何发送

不想将这些文件内容复制/粘贴到运行
scan
的终端中。我也不想关闭ASLR

我试过/读过的东西 我已经阅读了和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);
}
#包括
int main(int argc,字符**argv)
{
字符字母[1];
字符缓冲区[8];
printf(“输入字母:”);
int result=scanf(“%s”,字母);
printf(“您输入了:%s\n”,字母);
}

请参阅如何在使用gdb运行时启用ASLR。这是真正问题的答案。XY问题的答案可能是让gdb运行
close(0);打开(“有效载荷”,仅限Ordu)模拟终端输入最好通过对终端设备本身进行操作来完成,例如在Unix或Linux系统上使用TIOCSTI,而不是戳目标进程。演示了几种方法。请参阅如何在使用gdb运行时启用ASLR。这是真正问题的答案。XY问题的答案可能是让gdb运行
close(0);打开(“有效载荷”,仅限Ordu)模拟终端输入最好通过对终端设备本身进行操作来完成,例如在Unix或Linux系统上使用TIOCSTI,而不是戳目标进程。展示了几种实现这一点的方法。
#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);
}