如何编写在程序上执行 gdb 的 bash 脚本

Posted

技术标签:

【中文标题】如何编写在程序上执行 gdb 的 bash 脚本【英文标题】:How to write a bash script that executes gdb on a program 【发布时间】:2020-04-04 20:29:32 【问题描述】:

我正在从http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/Buffer_Overflow.pdf 重新创建缓冲区溢出,并且我想编写一个 bash 脚本,它将 gdb 放在我的“堆栈”可执行文件上。然后,该脚本将创建断点并获取将作为参数传递到 ./exploit 的缓冲区的请求 (p &buffer) 和结束 (p $ebp) 的地址。

当我运行我的脚本时..

#!/bin/sh
gdb stack
b main
b 14
run
b 23
c
p &buffer
p $ebp

当我使用它时,gdb 会在我的可执行文件上打开。但是,脚本的其余部分不会执行。我认为这是因为 gdb 创建了一个新进程。我已经尝试使用“ gdb stack "$$" " 来让 gdb 在与我的脚本相同的进程中运行,但是没有成功。

我正在尝试做的事情可能吗?

编辑:

新脚本:这会正确地将地址输出到命令行

#!/bin/sh
gdb stack << 'EOF'
  b main
  run
  b 23
  c
  s
  p &buffer
  p $ebp
  quit
EOF

如何获取这些地址,以便将它们作为参数传递给 ./exploit?

我的 bash 文件的以下行将是..

./exploit <&buffer> <$ebp>

【问题讨论】:

shell脚本中的每一行都是一个shell命令——所以当gdb退出时,运行脚本的shell将尝试运行命令bruncpbuffer等需要将后续行重定向到gdb的输入;使用此处的文档gdb stack &lt;&lt;'EOF',后跟您的gdb 命令,然后使用仅包含EOF 的行(左对齐)。 成功了!我刚刚对一个新问题进行了编辑。 您可能需要将标准输出(来自gdb)重定向到一个文件:gdb &lt;&lt;'EOF' &gt;gdb.output 以将信息放入gdb.output。然后,您将不得不担心清理数据以获取两个地址。 ASLR 可能会给你带来麻烦——小心。 不知道——他们发明了这些叫做“manuals”的东西,可以帮助解释程序是如何工作的。我必须阅读它才能找到答案;因为这不是我的问题,所以我将阅读过程委托给您。您也许可以使用p &amp;buffer &gt;buffer.out 之类的东西。但我不做任何承诺——我没有读过手册。 【参考方案1】:

试试

gdb -batch yourfile

man gdb 中所假设的那样。

或查看here 的示例。

【讨论】:

以上是关于如何编写在程序上执行 gdb 的 bash 脚本的主要内容,如果未能解决你的问题,请参考以下文章

从bash循环执行gdb立即退出

在QtCreator命令行上指定GDB启动脚本

如何为需要 4 个数字输入的 C 程序编写 Bash 脚本? [复制]

编写 GDB 脚本来收集数据

如何用 bash-support 插件将 Vim 编辑器打造成编写 Bash 脚本的 IDE

使用 GDB 在堆栈上打印符号