본문 바로가기
시스템 해킹/드림핵

[Dreamhack] Off_by_one_001

by L3m0n S0ju 2021. 5. 7.

 


 

 

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

 


 

위 코드는 문제에서 주어진 코드이다. 코드를 요약하면 read_str로 이름을 20바이트 크기만큼 입력받고 name 배열의 index 20에 '\0'을 삽입한다. 따라서 20바이트 크기를 초과하여 한 바이트를 오염시킬 수 있다.

 

위 gdb main 함수 결과는 main 함수의 name배열과 age변수를 어셈블리로 분석한 것이다. sub sep,0x18을 통해 name 변수는 ebp와 24만큼 떨어져 있고 바로 아래 ebp-0x4에 1을 저장하므로 ebp-0x4가 age변수의 주소 임을 알 수 있다. 따라서 name 배열과 age 변수의 차이는 20바이트이고 read로 name 배열을 20바이트 만큼 채우면 21번째에 '\0'을 추가하므로 age가 0으로 덮어씌워진다. age가 0이면 get_shell()이 실행되므로 쉘을 획득할 수 있다.

 

 


 

플래그

 

'시스템 해킹 > 드림핵' 카테고리의 다른 글

[Dreamhack] basic_exploitation_003  (0) 2021.05.22
[Dreamhack] oneshot  (0) 2021.05.11
[Dreamhack] basic_rop_x64  (0) 2021.05.05
[Dreamhack] basic_rop_x86  (1) 2021.05.03
[Dreamhack] off_by_one_000  (0) 2021.04.18

댓글