이게 처음부터 애를 먹었던게 이전 문제 들과 같이 윈도우 크롬 브라우저에서 서버 생성을 하니까
이런 페이지가 계속 나왔다.
그래서 뭐지?? 싶어서 소드를 보니까 C로 되어 있어서 VScode에서 C실행하는걸 열심히 찾아보다가 다른 풀이 들을 보니까 칼리 환경에서 하길래 얼른 칼리부터 설치 했다.
칼리에서 가상 서버를 접속하면 이런 숫자가 나온다. 그리고 새로고침을 하면 계속 4자리 숫자들이 바뀌는걸 확인할 수 있다.
그리고 이걸 그냥 리눅스 커널에서 실행시키면
이렇게 타임아웃이 발생하는걸 볼 수 있다.
그럼 주어진 C코드를 확인해 보자
// Name: chall.c
// Compile Option: gcc chall.c -o chall -fno-stack-protector
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>
#define FLAG_SIZE 0x45
void alarm_handler() {
puts("TIME OUT");
exit(1);
}
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
}
int main(void) {
int fd;
char *flag;
initialize();
srand(time(NULL));
flag = (char *)malloc(FLAG_SIZE);
fd = open("./flag", O_RDONLY);
read(fd, flag, FLAG_SIZE);
close(fd);
int num1 = 0;
int num2 = 0;
int inpt = 0;
for (int i = 0; i < 50; i++){ // 난수 생성
alarm(1);
num1 = rand() % 10000;
num2 = rand() % 10000;
printf("%d+%d=?\n", num1, num2);
scanf("%d", &inpt);
if(inpt != num1 + num2){
printf("Wrong...\n");
return 0;
}
}
puts("Nice!");
puts(flag);
return 0;
}
우린
for (int i = 0; i < 50; i++)
이 부분에서 서버(C코드)가 생성한 랜덤한 4자리 숫자를 받은다음 더해서 합을 다시 서버에게 보내주면 된다.
그 보낸 값이 scanf(%d)로 들어가서 wrong이 출력 안되게 하면 한다.
문제가 풀린다.
from pwn import *
#원격 서버에 연결
conn = remote('host3.dreamhack.games', 23769)
for _ in range(50):
#서버로부터 문제를 받음
question = conn.recvline().decode().strip()
#'=' 기준으로 숫자를 분리
num_str, _ = question.split('=')
#'+' 기호를 기준으로 숫자를 분리
num1, num2 = map(int, num_str.split('+'))
#덧셈을 계산하고 결과를 서버에 전송
conn.sendline(str(num1 + num2))
#결과를 출력
print(conn.recvall().decode())
50개의 문제를 모두 풀고 나면, 서버로부터 결과 메시지를 받는다. 이 메시지를 받아서 출력. 만약 모든 문제가 정답이라면 성공 메시지와 함께 flag를 받을 수 있다.
이걸 실행 시키면
이렇게 flag가 출력된다.