【发布时间】: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之类的东西。但我不做任何承诺——我没有读过手册。
标签: c bash gdb buffer-overflow