#!/bin/sh # ragg2-cc : a shellcode compiler -- pancake - 2011-2013 # # Supported operating systems: # - GNU/Linux # - OSX # - BSD # Supported compilers # - gcc # - clang # TODO # add support for arm # add support for nested shellcodes # Find which compiler is installed if [ -z "${CC}" ]; then for a in llvm-gcc clang gcc ; do $a --version >/dev/null 2>&1 if [ $? = 0 ]; then CC="$a" break fi done if [ -z "${CC}" ]; then echo "Cannot find CC" > /dev/stderr exit 1 fi fi # Get path for sflib if [ -z "${SFLIBPATH}" ]; then SFLIBPATH="$(r2 -hh | grep INCDIR | awk '{print $2}')"/sflib fi if [ ! -d "${SFLIBPATH}" ]; then echo "Cannot find ${SFLIBPATH}" echo "Define SFLIBPATH env var or fix the r2 installation" exit 1 fi # Get local architecture case "$(uname -m)" in "x86_64") B=64 ;; *) B=32 ;; esac dohelp() { cat< Compile" echo "${CC} ${CFLAGS} -o $F.tmp -S ${OPT} $F" fi rm -f "$F.bin" ${CC} ${CFLAGS} -o "$F.tmp" -S ${OPT} "$F" || fail echo "${SHDR}" > $F.s cat "$F.tmp" \ | sed -e s,rdata,text, -e s,rodata,text, -e 's,get_pc_thunk.bx,__getesp__,g' \ | grep -v .cstring | grep -v size | grep -v ___main | grep -v section \ | grep -v __alloca | grep -v zero | grep -v cfi >> $F.s rm -f "$F.tmp" if [ $ASM = 1 ]; then echo "$F.s" exit 0 fi if [ "$D" ]; then echo "==> Assemble" echo "${CC} ${LDFLAGS} ${OPT} -o $F.o $F.s" fi ${CC} ${LDFLAGS} ${OPT} -o "$F.o" "$F.s" || fail if [ "$D" ]; then echo "==> Link" #echo "${OBJCOPY} -j .text -O binary $F.o $.text" echo "rabin2 -o '$F.text' -O d/S/${TEXT} $F.o" fi rabin2 -o "$F.text" -O d/S/${TEXT} $F.o if [ "`du $F.text|awk '{print $1}'`" = 0 ]; then # use objcopy as falback for rabin2 ${OBJCOPY} -j .text -O binary $F.o $F.text || fail fi if [ "$C" = 1 ]; then if [ "$O" ]; then mv "$F.text" "$O" else O="$F.text" fi echo "$O" exit 0 fi [ "$X" = 1 ] && exec rax2 -S < "$F.text" if [ "$D" ]; then # hexdump -C $F.text rax2 -S - < $F.text ls -l $F.text fi [ -z "$O" ] && O="$F.bin" ragg2 -b "$B" -C "$F.text" -F -o "$O" || fail echo "$O" rmtemps exit 0