如何编写在程序上执行 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将尝试运行命令b
、run
、c
、 p
、buffer
等需要将后续行重定向到gdb
的输入;使用此处的文档gdb stack <<'EOF'
,后跟您的gdb
命令,然后使用仅包含EOF
的行(左对齐)。
成功了!我刚刚对一个新问题进行了编辑。
您可能需要将标准输出(来自gdb
)重定向到一个文件:gdb <<'EOF' >gdb.output
以将信息放入gdb.output
。然后,您将不得不担心清理数据以获取两个地址。 ASLR 可能会给你带来麻烦——小心。
不知道——他们发明了这些叫做“manuals”的东西,可以帮助解释程序是如何工作的。我必须阅读它才能找到答案;因为这不是我的问题,所以我将阅读过程委托给您。您也许可以使用p &buffer >buffer.out
之类的东西。但我不做任何承诺——我没有读过手册。
【参考方案1】:
试试
gdb -batch yourfile
如man gdb
中所假设的那样。
或查看here 的示例。
【讨论】:
以上是关于如何编写在程序上执行 gdb 的 bash 脚本的主要内容,如果未能解决你的问题,请参考以下文章
如何为需要 4 个数字输入的 C 程序编写 Bash 脚本? [复制]