촉촉한초코칩

[Dreamhack] set-int 본문

Study/MISC

[Dreamhack] set-int

햄친구베이컨 2025. 1. 14. 23:04

 

코드 분석

//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를 입력받고 0보다 크면 a + 1을 b에 넣고, b가 1보다 작은지 검사한다. 

b-1를 b에 넣고 b가 0보다 크면 쉘을 실행시킨다. 

만약 b가 0보다 작다면 -인데, 거기에 -1를 하고 0보다 큰지 검사한다. 

 

조건 1

우선 a는 unsigned int로 선언되어 있다. 이후 a가 0보다 큰지 검사하고 a+1을 b에 넣어 b가 0이 되도록 해야 하므로 a는 -1이 되어야 한다. 

unsigned int의 범위는 0~ 4,294,967,295로 -1가 들어갈 수 없지만 만약 -1이 들어간다면 unsigned int에는 음수형이 들어갈 수 없으므로 모든 비트가 1이 되어 a에는 4,294,967,295가 들어가게 된다. 

그리고 a를 int형으로 바꾸고 +1을 한다. 이때 a는 모든 비트가 1이므로 부호 비트도 1이 된다. 그래서 a는 -1이 되어 +1 계산 하면 b가 0이 된다. 

 

조건 2

먼저 int의 범위는 -2,147,483,648 ~ 2,147,483,647와 같다. 

만약 b에  -2,147,483,648을 넣는다면 if문 조건에 통과되고 여기에 -1을 계산하면 overflow되어 b에 양수값이 들어가 두번째 조건도 통과된다. 

그런데 음수를 입력하니 여기서 멈추고 아무것도 뜨지 않았다. 

그러면 반대로 양수에서 overflow(2,147,483,648)된다면, 음수로 넘어가게 되고 - 2,147,483,648에서 -1을 하면 다시 양수가 된다.

여기서 또 안된다..흠.. 

 

와,,, 안되는게 아니라 그냥 아무것도 안 뜨는게 맞는거였다... 

$ 이런 표시가 없어서 계속 안 되는 줄 알고 몇시간을 헤맸다.. 

성..공ㅎ..ㅎ

'Study > MISC' 카테고리의 다른 글

[CodeEngn] Malware L06  (0) 2024.12.30
[Dreamhack] Just read flag  (0) 2024.11.13
[Dreamhack] 산타 할아버지도 힘들어요  (0) 2024.10.29
[Dreamhack] whatsdifferent  (1) 2024.10.02
[Dreamhack] file-special-bit  (0) 2024.09.29