首页 > 解决方案 > 如何将输入发送到 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);
}

标签: clinuxdebugginggdb

解决方案


推荐阅读