카테고리 없음
[드림핵]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를 열면 플래그 값이 나온다. 흑. 노트북 초기화해야되나. 흑. 뭐가 문제지 ㅎ.극 .