Je suis actuellement en train d'apprendre le langage d'assemblage 64 bits à partir du cours Pentester Academy associé. Le code je travaille crée l'erreur suivante lorsqu'il est lancé dans GDB:GDB - Programme d'assemblage renvoie/bin/sh: 0: Impossible d'ouvrir
/bin/sh: 0: Impossible d'ouvrir [1 Inferior (processus 4049) liquide' avec le code 0177]
J'ai googlé l'erreur et le code de sortie et n'ai rien trouvé d'utile. J'ai essayé d'analyser le code dans GDB encore et encore, mais toutes les bonnes valeurs semblent être dans les bons registres. Je n'arrive pas à trouver ce qui ne va pas.
Vous pouvez trouver le code ci-dessous. Mon but est simplement d'invoquer le syscall execve en utilisant la technique jump-call-pop.
global _start
section .text
_start:
jmp bash
code:
xor rax, rax
pop rdi
mov [rdi +7], al
push rdi
mov rsi, rsp
push rax
mov rdx, rsp
mov al, 59
syscall
bash:
call code
string: db '/bin/shABBBBBBBBCCCCCCCC'
EDIT:
Voici comment je construit le programme:
nasm -f elf64 -o execve_stack_jcp.o execve_stack_jcp.asm
ld -o execve_stack_jcp execve_stack_jcp.o
J'utilise ensuite objdump -M intel -d execve_stack_jcp
pour sortir le démontage que je puis entrée dans ce programme c:
#include <stdio.h>
#include <string.h>
unsigned char code[] = \
"\xeb\x13\x48\x31\xc0\x5f\x88\x47\x07\x57\x48\x89\xe6\x50\x48\x89\xe2\xb0\x3b\x0f\x05\xe8\xe8\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x41\x42\x42\x42\x42\x42\x42\x42\x42\x43\x43\x43\x43\x43\x43\x43\x43";
int main(void) {
printf("Shellcode length: %d\n", (int)strlen(code));
int (*ret)() = (int(*)())code;
ret();
return 0;
}
Enfin, je compile le programme c en utilisant:
gcc -fno-stack-protector -z execstack -o shellcode shellcode.c
Comment avez-vous construit ce code? –
Bien sûr, la méthode JMP/CALL/POP n'est pas requise dans le code 64 bits si vous utilisez l'adressage RiP (relatif). –
Serait utile si vous avez montré comment vous construisez et exécutez votre programme. Mais une observation est que avec 'execve'' argv' et 'argp' ont besoin d'être des listes terminées NULL de chaînes, mais vous ne pouvez terminer que null en argp (en appuyant d'abord sur' rax'). Vous devez NULL terminer 'argv' aussi. Donc ** avant ** 'push rdi' vous devriez aussi faire' push rax' –