gpt4 book ai didi

linux - 在 GDB 中写入十六进制

转载 作者:IT王子 更新时间:2023-10-28 23:52:37 26 4
gpt4 key购买 nike

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

我需要写入生成的数据:

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 参数运行,因此不可用。

任何帮助都会很棒!

最佳答案

My question is: does GDB have some way for me to insert generated text like this into an interactive, running program?

您的问题是基于误解:您似乎认为 GDB 以某种方式拦截了您正在执行的“粘贴”,并且不让目标程序读取字符。

但是,GDB 不会拦截任何输入,直到并且除非您在断点处(或由于信号)停止。因此,当您的程序正在运行(并读取输入)时,GDB 本身被阻塞(在 waitpid 系统调用中)等待某些事情发生。

那么是什么阻止了您的程序接收控制字符呢?您的终端仿真器可以。

好的,您如何安排非 ASCII 输入? 3种方式之一(两种非常相似):

  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的程序),但对直接读取​​终端的程序(例如sudopasswd, gpg).

方法#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.

关于linux - 在 GDB 中写入十六进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15626093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com