촉촉한초코칩
[Dreamhack] set-int 본문
코드 분석
//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 |