问题抄自这里:
我有一个程序,它接受输入 stdin 还带有一些参数 从命令行。看起来像这样:
cat input.txt > myprogram -path "/home/user/work"
我尝试用gdb调试代码 在 emacs 中,通过 M-x gdb,我尝试 使用以下命令加载程序:
gdb cat input.txt > myprogram -path "/home/user/work"
但是,gdb 不喜欢它。
不幸的是,我不理解解决方案,并且不知道除了使用
-g
选项编译并运行命令 M-x gdb 之外还能做什么。
如果你是从 shell 中执行此操作,你会这样做:
% gdb myprogram
gdb> run params ... < input.txt
这似乎也适用于 emacs。
有几种方法可以做到:
$ gdb myprogram
(gdb) r -path /home/user/work < input.txt
或
$ gdb myprogram
(gdb) set args -path /home/user/work < input.txt
(gdb) r
或
$ gdb -ex 'set args -path /home/user/work < input.txt' myprogram
(gdb) r
其中 gdb
run
命令 (r
) 默认使用之前通过 set args
设置的参数。
已经过去十一年了,这个问题已经有了答案,但对于未来像我这样的人,我只是想补充一些东西。
运行
gdb your_program
后,如果您只输入run < file_containing_input
,程序将一直运行到最后,您可能无法发现问题,因此在执行run < file_containing_input
之前先休息一下。像这样的东西
$ gdb your_program
gdb> break main
gdb> run < file_containing_input
为了完整起见,在启动调试会话时还有 --args 选项。即)
gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3
如果您不需要从一开始就进行调试,您还可以使用以下方法附加到已经运行的进程:
$ gdb myprogram xxx
其中 xxx 是进程 ID。那么你不需要告诉 gdb 起始参数。
我想指出 mkfifo 的技术,如下所述:
如果您有一个比仅读取一个文件更复杂的管道,例如:
cat jonesforth.f examples/defining-words.f - |./jonesforth
mkfifo 非常方便。
char *argv[]
在bash中:
$> ./myprogram -path "/home/user/work"
在gdb中:
(gdb) run -path "/home/user/work"
在bash中:
$> cat ./input.txt | ./program
在gdb中:
(gdb) run < ./input.txt
在bash中:
$> python -c 'print("input")' | ./myprogram
在gdb中:
(gdb) run < <(python -c 'print("input")')
在gdb中:
(gdb) run < <(python -c 'print("readline1")') <(python -c 'print("readline2")')
来源:https://www.labri.fr/perso/fleury/posts/security/payload-injection.html