thread - linux debug



在GDB中写入十六进制 (1)

我的问题是:GDB是否有一些方法可以将这种生成的文本插入交互式运行程序中?

你的问题是基于错误的理解:你似乎觉得GDB是以某种方式拦截你正在执行的“粘贴”,而不让目标程序读取这些字符。

但是,GDB 不会拦截任何输入,除非您在断点处(或由于信号)。 所以,当你的程序运行(并读取输入)时,GDB本身被阻塞(在waitpid系统调用中)等待发生。

那么,什么阻止你的程序接收控制字符? 你的终端模拟器呢。

好的,你怎么安排非ASCII输入? 三种方法之一(两个非常相似):

  1. 使用来自文件的输入
  2. 使用来自命名管道的输入
  3. 使用gdbserver

对于方法#1:

perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' > /tmp/input
gdb ./a.out
(gdb) run < /tmp/input   # voila: GDB reads terminal,
                         # your program reads /tmp/input

方法2:

mkfifo /tmp/pipe
perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' > /tmp/pipe &
# perl will block, waiting for someone to read the pipe
gdb ./a.out
(gdb) run < /tmp/pipe

上述两种方法都适用于“正常”程序(读取STDIN ),但对于直接读取终端的程序(例如sudopasswdgpg )将会失败。

方法3:

perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' |
gdbserver :0 ./a.out  # gdbserver will print a TCP port, e.g. 4321
                      # and stop the program at start

# in another window,
gdb ./a.out
(gdb) target remote :4321
# gdb will now attach to gdbserver, you can set breakpoints and continue.

我在一个软件安全类,我们正在学习缓冲区溢出和如何被利用。 我有一个程序,我知道如何利用,但我似乎无法这样做,因为我必须写十六进制,它不允许我写。

我需要写出从以下产生的数据:

perl -e 'print "A"x48; print "\x1b\x88\x04\x08";'

但是,我不能将该输出重定向到命令行参数中,因为该程序是交互式运行的。 从历史上看,我已经使用xclip将其复制到剪贴板,然后将其粘贴到正在运行的应用程序中,但由于某种原因,这个十六进制序列不允许我使用xclip来复制它(它显示为没有被复制)。

例如:

perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' | xclip -sel clip

如果我按Ctrl + V之后,没有粘贴。 如果我只是从终端窗口复制粘贴输出,粘贴错误的十六进制(我假设这是因为十六进制是不可见的ASCII)。

我的问题是:GDB是否有一些方法可以将这种生成的文本插入交互式运行程序中?

我知道,如果可利用的程序采取了命令行参数,我可以这样做:

run $(perl -e 'print "A"x48; print "\x1b\x88\x04\x08";')

但是因为它不通过cli参数运行,所以这是不可用的。

任何帮助都是极好的!





overflow