what is mprotect & bypass

https://dreamhack.io/wargame/challenges/870?writeup_page=6

해당 문제를 풀면서 생긴 일이다.

C
// Name: chall.c
// Compile: gcc -fno-stack-protector chall.c -o chall

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

#define FLAG_SIZE 0x45

void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);
}

int main(int argc, char *argv[]) {
    int len;
    char * fake_flag_addr;
    char buf[0x20];
    int fd;
    char * real_flag_addr;

    initialize();

    fd = open("./flag", O_RDONLY);
    len = FLAG_SIZE;
    fake_flag_addr = "DH{****************************************************************}";

    printf("fake flag address: %p\n", fake_flag_addr);
    printf("buf address: %p\n", buf); // stack leak

    real_flag_addr = (char *)mmap(NULL, FLAG_SIZE, PROT_READ, MAP_PRIVATE, fd, 0);
    printf("real flag address (mmapped address): %p\n", real_flag_addr);

    printf("%s", "input: ");
    read(0, buf, 60);

    mprotect(real_flag_addr, len, PROT_NONE);

    write(1, fake_flag_addr, FLAG_SIZE);
    printf("\nbuf value: ");
    puts(buf);

    munmap(real_flag_addr, FLAG_SIZE);
    close(fd);

    return 0;
}

코드 상에

Python
    mprotect(real_flag_addr, len, PROT_NONE);

이 부분이 상당히 거슬린다.

 mprotect느 Linux 시스템에서 메모리 보호 속성을 바꾸는 함수로

인자는 각각 보호할 위치 , 보호할 길이 , 주어질 권한 이다.

여기서 PROT_NONE 은 아무 권한도 안주겠다는 말로 접근을 못하게 된다.

how to bypass?

사실 쉽다. Arbitary writable 이나 Bof 취약점을 통해 real_flag_addr 변수에 들어가 있는 주소 값을 overwrite 하거나 len 값을 0으로 만들어야 한다.

나는 다음과 같이 변수를 바꾸었다.