Dreamhack/Dreamhack Wargame (Challenge)

[31] IT 비전공자 [dreamhack] addition-quiz문제 풀기

imaginefuture-1 2024. 10. 10. 09:31

 

31번째 문제 가보자구!

 

앗 무서운 그 이름 pwntools...

분명 저번에 우분투 설정 문제 이슈로 아마 pwntools 설치가 안됐던걸로 기억나는데...

하...

 

(먼산)

 

일단 문제 코드를 보자

 

 

// 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;
}

 

 

문제 설명에 쓰여져 있는대로 랜덤 값을 생성하여 일치하는지 확인하는 프로그램이다.

 

손은..눈보다..빠르지 못했다..

아니 선생님 1초만에 저걸 어떻게 풀어욧...

 

문제를 풀 프로그램을 만들어야한다.

 

https://eliez3r.github.io/write-up/2024/04/21/writeup-dreamhack-addition_quiz.html

 

[DreamHack] addition-quiz - eli_ez3r Hacking Blog

beginner Description 랜덤한 2개의 숫자를 더한 결과가 입력 값과 일치하는지 확인하는 과정을 50번 반복하는 프로그램입니다. 모두 일치하면 flag 파일에 있는 플래그를 출력합니다. 알맞은 값을 입력

eliez3r.github.io

여기 블로그 글을 보면 문제 풀이 코드를 짜놓으셨는데

 

 

pwntools..

 

설치부터 막혔다...

젠장..

 

이거 우분투 설정방법 살려줘ㅓㅓㅓㅓㅓ

 

 


 

2024-10-22 드디오 풀었다!!!!!캬ㅑ!!!

 

망할 들여쓰기 때문에 20분은 날려먹은 것 같다..하핳 하하하! 풀었다고!!

들여쓰기는 tap...영원히 잊지못할 것 같다..후..

https://yun-2.tistory.com/m/entry/CTFSeason5Round2addition-quiz

 

[Dreamhack] CTF Season5 Round #2 - addition-quiz

🛎️ Access 랜덤한 2개의 숫자를 더한 결과가 입력 값과 일치하는지 확인하는 과정을 50번 반복하는 프로그램입니다. 모두 일치하면 flag 파일에 있는 플래그를 출력합니다. 알맞은 값을 입력하여

yun-2.tistory.com

코드는 이 분 블로그를 참고했다


1) from pwn import *: pwn 라이브러리를 임포트. 바이너리 익스플로이테이션과 리버스 엔지니어링을 위한 도구 제공.
2) conn = remote(['address'], [port number]): 원격 서버에 연결. 'address'와 'port number'는 실제 서버의 주소와 포트 번호.
3) question = conn.revline().decode().strip(): 서버로부터 한 줄 수신하고, 이를 디코드하여 문자열로 변환, 양 끝의 공백을 제거.
4) num_str, _ = question.split("="): 수신한 문자열을 '=' 기호를 기준으로 분리, 분리한 첫 번째 부분을 num_str에 저장.
5) num1, num2 = map(int, num_str.split('+')): num_str을 '+' 기호를 기준으로 분리, 분리한 각 부분을 정수로 변환, 이를 num1과 num2에 저장.
6) conn.sendline(str(num1 + num2)): num1과 num2를 더한 결과를 문자열로 변환, 이를 서버에 전송.
7) print(conn.revall().decode()): 서버로부터 수신한 모든 데이터를 디코드하여 출력.
 
출처:https://yun-2.tistory.com/m/entry/CTFSeason5Round2addition-quiz