最近一直在忙着写论文。突然领导又分配任务,帮写个自动提取shellcode的脚本工具。因为之前,我们都是用objdump查看后,把shellcode一个个添加进去,很麻烦,害怕写错。所以说我们写这个工具还是挺有必要的。首先我们要先了解几个用到的命令。objdump,od,dd.这几个对于提取shellcode很有用。
objdump 有点象那个快速查看之类的工具,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。这里我们讲用到-d -F 选项。-d disassemble. 反汇编 那些应该还有指令机器码的section。-F fileoffset.显示文件偏移量。是为了我们能够定位到出我们想要的shellcode。
od 命令。dump files in octal and other formats. 就是可以以各种格式输出文件。 -t 输入格式,我选x1,表示十六进制一个字节为一个单位。
dd命令。Copy a file converting and formatting according the operands.我用这个命令来提取shellcode。-bs选项,是每次读取的字节数。-if,输入文件。-of,输出文件。-skip,跳过的字节数,就是从objdump活得的偏移量。-count 复制的数量,这个我们通过计算获得。
首先我们看下用来测试的execve2.asm:
Section .text global _start _start: jmp short GotoCall shellcode: pop esi xor eax,eax mov byte [esi + 7], al lea ebx,[esi] mov long [esi + 8],ebx mov long [esi + 12],eax mov byte al,0x0b mov ebx,esi lea ecx,[esi + 8] lea edx,[esi + 12] int 0x80 GotoCall: call shellcode db '/bin/shJAAAAKKKK'
用nasm -f elf execve2.asm 会把文件'execve2.asm'汇编成'ELF'格式 的文件'execve2.o
然后我们用 objdump -d -F execve2.o 来查看。
extract_shellcode.sh
总共有5个输入参数,第一个是输入的文件,execve2.o, 第二个是输出文件的格式execv2.raw,第三个是shellcode开始的标识,我们这里的开始标示是
#!/bin/bash BEGIN=$(objdump -d -F $1 | grep “<$3>” | awk 'NR==1 {print $NF ;}') BEGIN=${BEGIN%)*} ((BEGIN=BEGIN+0x0)) echo $BEGIN END=$(objdump -d -F $1 | grep "<$4>" | awk 'NR==1 {print $NF ;}') END=${END%)*} ((END=END+0x0)) echo $END ((VAR=END-BEGIN)) echo $VAR dd bs=1 if=$1 of=$2 skip=$BEGIN count=$VAR if [ "$5" = "c" ]; then TMP=tmp; touch $TMP; echo "unsigned int shellcode[] =" > $TMP; od -t x1 $2 | awk '{$1="";print;}' | sed 's/\ /\\x/g' | sed '/^$/d;s/^/\"/g;s/$/\"/g' >> $TMP; cat $TMP | awk '{print;} END{print ";";}' > $2; rm $TMP; fi
下面是我获得的execve2.raw格式的。
下面是生成C语言格式的:
下面是生成的execve2.c:
提取的结果和我们前面用objdump 看的execve2.o里面的是完全一样的。大功告成!
2013/4/29 13:58