본문 바로가기
CTF/Dreamhack

[Dreamhack] set-int

by 8희 2023. 11. 15.

https://dreamhack.io/wargame/challenges/958

 

set-int

Description 주어진 바이너리와 소스 코드를 분석하고 알맞은 입력값을 찾아 쉘을 획득하세요! 플래그는 flag 파일에 있습니다. 플래그의 형식은 DH{...} 입니다.

dreamhack.io

 

바이너리와 소스코드를 분석해서 입력 값을 찾아

쉘을 획득해야 되는 문제이다.

 

 

우분투에서 가상머신에 접속했다. 

 

//Name: chall.c
//Compile: gcc chall.c -o chall -no-pie -fno-stack-protector

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>

// 시간 초과 시 호출되는 함수
void alarm_handler() {
    puts("TIME OUT");  // "TIME OUT" 메시지 출력
    exit(-1);          // 프로그램 종료
}

// 초기화 함수
void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);  // 입력 버퍼를 비활성화
    setvbuf(stdout, NULL, _IONBF, 0); // 출력 버퍼를 비활성화

    signal(SIGALRM, alarm_handler);  // SIGALRM 시그널에 대한 핸들러 설정
    alarm(30);                       // 30초 타이머 설정
}

// 메인 함수
int main(int argc, char *argv[]){
    unsigned int a = 0;  // 부호 없는 정수 변수 a 초기화
    int b = 0;            // 정수 변수 b 초기화

    initialize();  // 초기화 함수 호출

    printf("Your input : \n");
    scanf("%u", &a);  // 사용자로부터 부호 없는 정수 입력 받음

    if(a > 0){  // a가 0보다 큰 경우
        b = (int)a + 1;  // a를 정수로 변환한 값에 1을 더해 b에 대입

        if(b == 0){  // b가 0인 경우
            printf("Success.\nYour second input : \n");
            scanf("%d", &b);  // 사용자로부터 정수 입력 받음

            if(b < 1){  // b가 1보다 작은 경우
                b = b - 1;  // b에 1을 더해줌

                if(b > 0){  // b가 0보다 큰 경우
                    system("/bin/sh");  // 셸 실행
                } else{
                    printf("fail!\n");  // "fail!" 메시지 출력
                }
            } else{
                printf("Input is too large!\n");  // "Input is too large!" 메시지 출력
            }            
        } else{
            printf("fail!\n");  // "fail!" 메시지 출력
        }
    } else{
        printf("Input is too small!\n");  // "Input is too small!" 메시지 출력
    }

    return 0;  // 프로그램 종료
}

 

문제 코드를 분석하면 이와 같다.

a는 부호 없는 정수의 최대값을 입력하고, b는 부호 있는 정수의 최소값을 입력해야 한다.

a에 부호 없는 정수의 최대값인  4294967295를 입력하면 오버플로우가 발생하고,

b에 부호 있는 정수의 최소값인 -2147483648를 입력하면 언더플로우가 발생해서

셸을 실행하게 된다.

 

 

서버에서 해당 값을 입력하면 /bin/sh로 이동한다.

이후 cat flag를 통해 flag 파일을 읽어서 flag를 획득할 수 있다. 

 

'CTF > Dreamhack' 카테고리의 다른 글

[Dreamhack] CSRF Advanced  (0) 2023.11.22
[Dreamhack] csrf-1  (1) 2023.11.22
[Dreamhack] csrf-2  (0) 2023.11.15
[Dreamhack] ROT128  (0) 2023.11.08
[Dreamhack] sql injection bypass WAF Advanced  (0) 2023.11.08