J'écris en assembleur et j'essaie de comprendre comment exécuter un appel système execve, mais au lieu d'avoir la sortie imprimée sur le terminal, j'aimerais savoir où il est stocké pour pouvoir l'utiliser plus tard, un peu comme les commandes de tuyauterie.Comment renvoyer la sortie d'un appel système syscall à un registre ou à la pile après l'avoir exécuté dans l'assembly?
Par exemple, l'assemblage est ici pour exécuter la commande « qui » via exec, essentiellement l'exécution de la commande « $ qui ls »:
GLOBAL _start
SECTION .TEXT
_start:
XOR EAX,EAX
PUSH EAX
PUSH 0x68636968
PUSH 0x772f6e69
PUSH 0x622f7273
PUSH 0x752f2f2f
MOV EBX, ESP
PUSH EAX
PUSH 0x736c
MOV ESI, ESP
XOR EDX, EDX
PUSH EDX
PUSH ESI
PUSH EBX
MOV ECX, ESP
MOV AL, 0x0B; EXECVE SYSCALL NUMBER
INT 0x80
lignes 7-10 pousser l'adresse de /usr/bin/which
sur la pile, et La ligne 13 pousse l'argument ls
sur la pile. Il pousse ensuite le tableau d'arguments sur la pile et stocke celui dans l'ECX, a l'EBX pointant vers l'adresse de l'emplacement de /usr/bin/which
, et l'EAX est mis au numéro de syscall 0xb (11) pour le syscall execve. Lorsqu'il est exécuté, il renvoie /bin/ls
, l'emplacement de ls
que nous lui avons demandé de trouver.
Comment stocker ce résultat de /bin/ls
quelque part pour une autre utilisation? Comme si je voulais continuer à écrire du code et utiliser ce qui est retourné ici comme une partie du code suivant, comment garder la valeur retournée dans un registre ou dans la pile?
Possible duplication de [Redirection de la sortie exec vers un tampon ou un fichier] (https://stackoverflow.com/questions/2605130/redirecting-exec-output-to-a-buffer-or-file). –
execve ne retourne pas sauf s'il échoue. – stark