|
|
|
@ -3,11 +3,13 @@ |
|
|
|
|
# NEEDED: lz4 readelf tar cat awk cut sed sh sort |
|
|
|
|
|
|
|
|
|
WORKDIR="$(basename "$1")" |
|
|
|
|
SYS_LIBDIR='/lib' |
|
|
|
|
if [ -z "$LIBPATH" ]; then |
|
|
|
|
LIBPATH='/lib' |
|
|
|
|
fi |
|
|
|
|
PRELOAD_SCRIPT='preload' |
|
|
|
|
LIBLIST=$WORKDIR/liblist |
|
|
|
|
SUMFILE=$WORKDIR/checksum |
|
|
|
|
tmpfile=$WORKDIR/tt |
|
|
|
|
LIBLIST="$WORKDIR"/liblist |
|
|
|
|
SUMFILE="$WORKDIR"/checksum |
|
|
|
|
tmpfile="$WORKDIR"/tt |
|
|
|
|
|
|
|
|
|
die () |
|
|
|
|
{ |
|
|
|
@ -17,67 +19,71 @@ die () |
|
|
|
|
|
|
|
|
|
getlibs () |
|
|
|
|
{ |
|
|
|
|
tmplist=$WORKDIR/tmplist |
|
|
|
|
tmplist="$WORKDIR"/tmplist |
|
|
|
|
|
|
|
|
|
touch $LIBLIST |
|
|
|
|
touch "$LIBLIST" |
|
|
|
|
|
|
|
|
|
# Take the executable and get the first level dependencies |
|
|
|
|
readelf -d "$1" | |
|
|
|
|
grep NEEDED | |
|
|
|
|
awk '{print $5}' | |
|
|
|
|
sed s/\\[/\ / | sed s/\\]/\ / > $tmplist |
|
|
|
|
sed s/\\[/\ / | sed s/\\]/\ / > "$tmplist" |
|
|
|
|
|
|
|
|
|
# While there are more dependencies |
|
|
|
|
while [ "$(cat $tmplist)" ]; do |
|
|
|
|
while [ "$(cat "$tmplist")" ]; do |
|
|
|
|
# Add them to the master file |
|
|
|
|
cat $LIBLIST $tmplist > $tmpfile |
|
|
|
|
mv -f $tmpfile $LIBLIST |
|
|
|
|
cat "$LIBLIST" "$tmplist" > "$tmpfile" |
|
|
|
|
mv -f "$tmpfile" "$LIBLIST" |
|
|
|
|
|
|
|
|
|
# Copy them to lib/ |
|
|
|
|
while read l; do |
|
|
|
|
find -L $SYS_LIBDIR -maxdepth 2 -name "$l" -exec cp -n {} $WORKDIR/lib/ \; |
|
|
|
|
done < $tmplist |
|
|
|
|
while read -r l; do |
|
|
|
|
( IFS=: |
|
|
|
|
for p in $LIBPATH; do |
|
|
|
|
find -L "$p" -maxdepth 2 -name "$l" -exec cp -n {} "$WORKDIR"/lib/ \; |
|
|
|
|
done |
|
|
|
|
) |
|
|
|
|
done < "$tmplist" |
|
|
|
|
|
|
|
|
|
# Extract their dependencies |
|
|
|
|
touch $tmpfile |
|
|
|
|
for f in $WORKDIR/lib/*; do |
|
|
|
|
if [ "$(grep -F "$(basename "$f")" "$tmplist")" ]; then |
|
|
|
|
touch "$tmpfile" |
|
|
|
|
for f in "$WORKDIR"/lib/*; do |
|
|
|
|
if grep -Fq "$(basename "$f")" "$tmplist"; then |
|
|
|
|
readelf -d "$f" | |
|
|
|
|
grep NEEDED | |
|
|
|
|
awk '{print $5}' | |
|
|
|
|
sed s/\\[/\ / | sed s/\\]/\ / >> $tmpfile |
|
|
|
|
sed s/\\[/\ / | sed s/\\]/\ / >> "$tmpfile" |
|
|
|
|
fi |
|
|
|
|
done |
|
|
|
|
sort -u $tmpfile > $tmplist |
|
|
|
|
sort -u "$tmpfile" > "$tmplist" |
|
|
|
|
done |
|
|
|
|
sort -u $LIBLIST > $tmpfile |
|
|
|
|
mv -f $tmpfile $LIBLIST |
|
|
|
|
rm -f $tmplist |
|
|
|
|
sort -u "$LIBLIST" > "$tmpfile" |
|
|
|
|
mv -f "$tmpfile" "$LIBLIST" |
|
|
|
|
rm -f "$tmplist" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ! [ $WORKDIR ]; then |
|
|
|
|
if ! [ "$WORKDIR" ]; then |
|
|
|
|
die 'Not enough arguments' |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
if ! test -d $WORKDIR ; then |
|
|
|
|
if ! [ -d "$WORKDIR" ]; then |
|
|
|
|
die 'Argument is not a directory' |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
if test -e $WORKDIR/bin; then |
|
|
|
|
if ! test -d $WORKDIR/bin; then |
|
|
|
|
if [ -e "$WORKDIR"/bin ]; then |
|
|
|
|
if ! [ -d "$WORKDIR"/bin ]; then |
|
|
|
|
die 'bin/ is not a directory' |
|
|
|
|
fi |
|
|
|
|
else |
|
|
|
|
die 'Directory does not contain bin/' |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
if ! test -e $WORKDIR/id; then |
|
|
|
|
if ! [ -e "$WORKDIR"/id ]; then |
|
|
|
|
die 'id file not present' |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
if ls -1 $WORKDIR/bin; then |
|
|
|
|
for f in $WORKDIR/bin/*; do |
|
|
|
|
if ! test -x $f; then |
|
|
|
|
if ls -1 "$WORKDIR"/bin; then |
|
|
|
|
for f in "$WORKDIR"/bin/*; do |
|
|
|
|
if ! [ -x "$f" ]; then |
|
|
|
|
die "$f is not executable" |
|
|
|
|
fi |
|
|
|
|
done |
|
|
|
@ -86,60 +92,65 @@ else |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
# Create necessary directories and files |
|
|
|
|
mkdir -p $WORKDIR/lib |
|
|
|
|
mkdir -p $WORKDIR/man |
|
|
|
|
mkdir -p $WORKDIR/ext |
|
|
|
|
touch $WORKDIR/env |
|
|
|
|
mkdir -p "$WORKDIR"/lib |
|
|
|
|
mkdir -p "$WORKDIR"/ext |
|
|
|
|
mkdir -p "$WORKDIR"/man |
|
|
|
|
touch "$WORKDIR"/env |
|
|
|
|
|
|
|
|
|
# TODO: add usage and error checking |
|
|
|
|
DIRNAME="$WORKDIR"/"$(head -1 $WORKDIR/id | awk '{print $1}')" |
|
|
|
|
|
|
|
|
|
if test -s $LIBLIST; then |
|
|
|
|
rm -f $LIBLIST |
|
|
|
|
DIRNAME="$WORKDIR"/"$(head -1 "$WORKDIR"/id | awk '{print $1}')" |
|
|
|
|
|
|
|
|
|
echo "Fetching binary dependencies..." |
|
|
|
|
if [ -s "$WORKDIR"/deps ]; then |
|
|
|
|
while read -r d; do |
|
|
|
|
( IFS=: |
|
|
|
|
for p in $PATH; do |
|
|
|
|
find -L "$p" -maxdepth 2 -name "$d" -exec cp -n {} "$WORKDIR"/bin/ \; |
|
|
|
|
done |
|
|
|
|
) |
|
|
|
|
done < "$tmplist" |
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
echo "Fetching dependencies and stripping binaries..." |
|
|
|
|
# TODO: get al binary dependencies from deps file |
|
|
|
|
# Get all dependencies and strip them |
|
|
|
|
for b in $WORKDIR/bin/*; do |
|
|
|
|
getlibs $b |
|
|
|
|
strip $b |
|
|
|
|
for b in "$WORKDIR"/bin/*; do |
|
|
|
|
getlibs "$b" |
|
|
|
|
strip "$b" |
|
|
|
|
done |
|
|
|
|
echo "Stripping libraries..." |
|
|
|
|
for l in $WORKDIR/lib/*; do |
|
|
|
|
strip $l |
|
|
|
|
for l in "$WORKDIR"/lib/*; do |
|
|
|
|
strip "$l" |
|
|
|
|
done |
|
|
|
|
|
|
|
|
|
echo "Compressing destination directory..." |
|
|
|
|
if test -d $DIRNAME; then |
|
|
|
|
rm -rf $DIRNAME |
|
|
|
|
if [ -d "$DIRNAME" ]; then |
|
|
|
|
rm -rf "$DIRNAME" |
|
|
|
|
fi |
|
|
|
|
mkdir -p $DIRNAME |
|
|
|
|
mkdir -p "$DIRNAME" |
|
|
|
|
|
|
|
|
|
cp -r $WORKDIR/bin $DIRNAME/ |
|
|
|
|
cp -r $WORKDIR/lib $DIRNAME/ |
|
|
|
|
cp -r $WORKDIR/man $DIRNAME/ |
|
|
|
|
cp -r $WORKDIR/ext $DIRNAME/ |
|
|
|
|
cp $WORKDIR/env $DIRNAME/ |
|
|
|
|
cp $WORKDIR/id $DIRNAME/ |
|
|
|
|
cp -r "$WORKDIR"/bin "$DIRNAME"/ |
|
|
|
|
cp -r "$WORKDIR"/lib "$DIRNAME"/ |
|
|
|
|
cp -r "$WORKDIR"/man "$DIRNAME"/ |
|
|
|
|
cp -r "$WORKDIR"/ext "$DIRNAME"/ |
|
|
|
|
cp "$WORKDIR"/env "$DIRNAME"/ |
|
|
|
|
cp "$WORKDIR"/id "$DIRNAME"/ |
|
|
|
|
|
|
|
|
|
tar -c -f $DIRNAME.tar -C $WORKDIR "$(basename $DIRNAME)" |
|
|
|
|
md5sum -b $DIRNAME.tar | cut -d " " -f1 > $SUMFILE |
|
|
|
|
lz4 --rm -9 -c $DIRNAME.tar > "$DIRNAME".tar.lz4 |
|
|
|
|
tar -c -f "$DIRNAME".tar -C "$WORKDIR" "$(basename "$DIRNAME")" |
|
|
|
|
md5sum -b "$DIRNAME".tar | cut -d " " -f1 > "$SUMFILE" |
|
|
|
|
lz4 --rm -9 -c "$DIRNAME.tar" > "$DIRNAME".tar.lz4 |
|
|
|
|
|
|
|
|
|
echo "Injecting payload..." |
|
|
|
|
cat "$PRELOAD_SCRIPT" | |
|
|
|
|
sed s/SUM/"$(cat $SUMFILE)"/ | |
|
|
|
|
sed s/SUM/"$(cat "$SUMFILE")"/ "$PRELOAD_SCRIPT" | |
|
|
|
|
sed s/ID/"$(basename "$DIRNAME")"/ | |
|
|
|
|
awk '!/^ *#/ && NF' > tpp |
|
|
|
|
|
|
|
|
|
size="$(wc -c tpp | cut -d " " -f1)" |
|
|
|
|
strsize="$(echo "BYTES" | wc -c)" |
|
|
|
|
numsize="$(echo "$size" | wc -c)" |
|
|
|
|
normsize="$(expr "$size" - "$(expr "$strsize" - "$numsize")")" |
|
|
|
|
normsize="$((size - (strsize - numsize)))" |
|
|
|
|
|
|
|
|
|
cat tpp | |
|
|
|
|
sed s/BYTES/"$normsize"/ > tpr |
|
|
|
|
sed s/BYTES/"$normsize"/ tpp > tpr |
|
|
|
|
cat tpr "$DIRNAME".tar.lz4 > "$DIRNAME".ti |
|
|
|
|
|
|
|
|
|
echo "Cleaning up..." |
|
|
|
|