카테고리 없음

[드림핵]set-int

채영채영 2023. 11. 15. 14:30

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");
    exit(-1);
}

void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);

    signal(SIGALRM, alarm_handler);
    alarm(30);
}

int main(int argc, char *argv[]){
    unsigned int a = 0;
    int b = 0;

    initialize();

    printf("Your input : \n");
    scanf("%u", &a);
    if(a > 0){
        b = (int)a + 1;
        if(b == 0){
            printf("Success.\nYour second input : \n");
            scanf("%d", &b);
            if(b < 1){
                b = b-1;
                if(b > 0){
                    system("/bin/sh");
                } else{
                    printf("fail!\n");
                }
            } else{
                printf("Input is too large!\n");
            }            
    
        } else{
            printf("fail!\n");
        }
    } else{
        printf("Input is too small!\n");
    }

    return 0;
}

a에 양수를 넣어서 a+1=b에서 b가 음수가 나와야하고, b에 음수를 넣어서 b-1에 양수가 나와야한다. => 오버플로우/언더플로우이다.

int 형의 경우 범위가 –2,147,483,648 ~ 2,147,483,647 이고, unsigned int(부호없는 정수)형의 경우 범위가 0 ~ 4,294,967,295 까지입니다.

만약 int 형이 2,147,483,647 + 1 이 되면 최대값을 넘겨져서 –2,147,483,648로 돌아옵니다.쉽게 이해하자면 값이 고리로 이어져 있다고 생각하면 편합니다!

출처: https://lucykorea414.tistory.com/49 [지은이는 지은이:티스토리]

가상 서버를 줬는데 오픈이 안돼서 powershell에서 연다. Netcat을 설치했는데도 안돼서 Telnet으로 접속,

input 두 개를 입력하면 ls 로 모든 파일을 열람할 수 있다. 이 때 flag를 열면 플래그 값이 나온다. 흑. 노트북 초기화해야되나. 흑. 뭐가 문제지 ㅎ.극 .