#1 Le 19/10/2008, à 16:51
- SamueLinux
[SHELL] Avis sur un script perso ... !
Bonsoir à tous,
J'ai codé un petit script qui à partir d'un fichier assembleur produit un shellcode correcte, et je voudrais avoir divers avis sur la
qualité du script, les améliorations possibles... etc
#!/bin/bash
#####################################################################################################
# #
# Ce script compile un fichier assembleur, extrait le code hexadécimal, ajoute les caractères #
# '\x' afin de produire un shellcode #
# #
#####################################################################################################
# On vérifie que le fichier.asm est présent sur la ligne de commande
if test -z $1
then echo $0 "<fichier.asm>" && exit
fi
# On vérifie que le fichier.asm existe dans le répertoire courant et que son extension est correcte
if test -e $1
then
if test $(echo $1 | cut -d "." -f2) != "asm"
then echo "L'extension du fichier "$1" n'est pas correcte : fichier.asm" && exit
fi
else
echo -n "Le fichier "$1" n'existe pas dans le répertoire : " && pwd && exit
fi
# On vérifie que le paquet nasm (compilateur assembleur) est installé
nasm=$(dpkg-query -W --showformat='${Installed-Size} ${Package}\n' | grep nasm | cut -d " " -f2)
if test -z $nasm
then sudo apt-get install nasm
fi
# Compilation du programme assembleur
nasm $1
##########
# Extraction du shellcode en hexadécimal depuis le résultat de l'exécution de hexdump
# ENTREE :
# 00000000 31 c0 b0 46 31 db 31 c9 cd 80 eb 10 5b 31 c0 88 |1..F1.1.....[1..|
# 00000010 43 07 50 53 89 e1 b0 0b 31 d2 cd 80 e8 eb ff ff |C.PS....1.......|
# 00000020 ff 2f 62 69 6e 2f 73 68 58 |./bin/shX|
# 00000029
# SORTIE :
# 31 c0 b0 46 31 db 31 c9 cd 80 eb 10 5b 31
# c0 88 43 07 50 53 89 e1 b0 0b 31 d2 cd 80
# e8 eb ff ff ff 2f 62 69 6e 2f 73 68 58
##########
shellcode=$(hexdump -C $(echo $1 | cut -d '.' -f1) | cut -d "|" -f1 | sed -e "s/^........//g")
##########
# Ajout des caractères '\x' dans le code hexadécimal
# ENTREE :
# 31 c0 b0 46 31 db 31 c9 cd 80 eb 10 5b 31
# c0 88 43 07 50 53 89 e1 b0 0b 31 d2 cd 80
# e8 eb ff ff ff 2f 62 69 6e 2f 73 68 58
# SORTIE:
# \x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80
# \xeb\x10\x5b\x31\xc0\x88\x43\x07\x50\x53
# \x89\xe1\xb0\x0b\x31\xd2\xcd\x80\xe8\xeb
# \xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68
# \x58
##########
shellcode=$(echo " "$shellcode | tr -d '\n' | sed -e 's/ / /g;s/ / /g;s/ /\\x/g')
##########
# Affichage du résultat sous la forme
#
# char shellcode[] = "\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80"
# "\xeb\x10\x5b\x31\xc0\x88\x43\x07\x50\x53"
# "\x89\xe1\xb0\x0b\x31\xd2\xcd\x80\xe8\xeb"
# "\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"
# "\x58";
##########
echo -en "\nchar shellcode[] = \""
echo -n $shellcode
echo -e "\";\n"
Merci d'avance à tous pour votre avis !
Hors ligne
#2 Le 19/10/2008, à 21:22
- Link31
Re : [SHELL] Avis sur un script perso ... !
1) On ne se base pas sur les extensions de fichiers sous Linux. Si l'utilisateur veut passer /dev/urandom comme argument, il en a tout à fait le droit...
2) Il y a déjà un programme qui fait ça dans les sources du noyau :
cat shellcode.o | /usr/src/linux/scripts/bin2c
3) setreuid() + execve() ... Aurais-tu de mauvaises intentions ?
Hors ligne
#3 Le 19/10/2008, à 21:31
- SamueLinux
Re : [SHELL] Avis sur un script perso ... !
1) On ne se base pas sur les extensions de fichiers sous Linux. Si l'utilisateur veut passer /dev/urandom comme argument, il en a tout à fait le droit...
Je n'ai pas trop comprit ce que tu veux me dire... Comment je peux faire alors pour exécuter le script que pour un fichier .asm ?
Nan, ce ne sont pas de mauvaises intentions , c'est juste que je me penche un peu sur la question, c'est un domaine que je trouves assez interressant !
Hors ligne
#4 Le 19/10/2008, à 21:52
- tiky
Re : [SHELL] Avis sur un script perso ... !
1) On ne se base pas sur les extensions de fichiers sous Linux. Si l'utilisateur veut passer /dev/urandom comme argument, il en a tout à fait le droit...
Je n'ai pas trop comprit ce que tu veux me dire... Comment je peux faire alors pour exécuter le script que pour un fichier .asm ?
Nan, ce ne sont pas de mauvaises intentions
, c'est juste que je me penche un peu sur la question, c'est un domaine que je trouves assez interressant !
Tu as la commande file qui te permet de déterminer le type de contenu d'un fichier.
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#5 Le 20/10/2008, à 15:37
- Link31
Re : [SHELL] Avis sur un script perso ... !
Je n'ai pas trop comprit ce que tu veux me dire... Comment je peux faire alors pour exécuter le script que pour un fichier .asm ?
Un fichier asm, c'est un fichier comme un autre. Tu n'as aucun moyen fiable de savoir si le fichier contient bien de l'assembleur (et le type d'assembleur que tu veux), de plus imposer ce genre de limitation n'a pas vraiment d'intérêt. Alors laisse l'utilisateur passer le fichier qu'il veut.
Hors ligne
#6 Le 20/10/2008, à 15:48
- ®om
Re : [SHELL] Avis sur un script perso ... !
$0, $1... doivent être entre " " !
et dans un de tes messages d'erreurs :
echo "L'extension du fichier \"$1\" n'est pas correcte"
Hors ligne
#7 Le 20/10/2008, à 16:19
- Nasman
Re : [SHELL] Avis sur un script perso ... !
Un fichier asm est par essence un fichier texte, Nasm reconnait les opérandes, les définitions de macros et d'autres choses.
Il faut s'assurer que le fichier est adapté à une sortie binaire (code pur) car un fichier asm peut contenir des noms de fonctions et la résolution de ces noms ne se fait qu'après l'édition de liens.
PC fixe sous Bionic 64 bits et portable avec Focal 64 bits
Hors ligne
#8 Le 20/10/2008, à 17:58
- SamueLinux
Re : [SHELL] Avis sur un script perso ... !
Merci à tous pour vos remarques !
Je vais corrigé les quelques modifications à faire !
Hors ligne