본문 바로가기

보안

[시스템해킹] 드림핵 워게임 basic_exploitation_000

유형: Stack Overflow

  • basic_exploitation_001.c
#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_flag() {
    system("cat /flag");
}

int main(int argc, char *argv[]) {

    char buf[0x80];

    initialize();
    
    gets(buf);

    return 0;
}

 

main 함수를 보면 128바이트의 buf 생성 후 initialize 함수로 진입

initialize 함수에서는 stdin, stdout의 버퍼링을 비활성화해 입출력이 즉시 처리되도록 함

gets(buf)로 사용자 입력 받음 <- 버퍼 오버플로우 발생 가능

그리고 30초간 입력 하지 않으면 TIME OUT 출력되고 프로그램 종료

read_flag() 함수를 호출해야 플래그 출력

 

  • 익스플로잇

gdb disas main 으로 버퍼 위치 확인

...

lea -0x80(%ebp),%eax -> ebp로부터 128바이트 위에 생성된다는 것 확인할 수 있음

그 위에 return address가 있으니까 132바이트만큼 덮어주고 

 

info func로 read_flag 주소를 찾아서

return address에 read_flag주소 넣어주면

 

flag 출력됨