본문 바로가기
Security/DreamHack

[DreamHack] addition-quiz #1114

by 고간디 2024. 3. 30.
랜덤한 2개의 숫자를 더한 결과가 입력 값과 일치하는지 확인하는 과정을 50번 반복하는 프로그램입니다.
모두 일치하면 flag 파일에 있는 플래그를 출력합니다.
알맞은 값을 입력하여 플래그를 획득하세요.

힌트로 pwntools를 줬다.

파이썬 모듈인데 확실히 파이썬은 신이다.

 

50번 덧셈을 1초 안에 해야하는데 이건 아인슈타인이 와도 못 할 것이다..

무조건 프로그램을 만들어서 쓰라는 것 같다.

 


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

50번 연산을 정확하게 하면 플래그를 얻을 수 있다.

 


from pwn import *

host = remote('host(num).dreamhack.games', (port))

for i in range(50):
    equation = host.recvline(1024)
    num = str(equation).split("'")[1][0:-4].split("+")
    host.sendline(str(int(num[0]) + int(num[1])))

print(host.recv(1024))

프로그램에 remote()를 통해서 연결하고 연산할 수식 즉, 출력값을 먼저 받는다.

4245 + 2564 처럼 네 자리 이내의 수 끼리의 덧셈 형태의 수식인데 각각 split으로 분할하고 잘라서 서로 더한 결과값을 입력값으로 내보낸다.

이 과정을 50번 하고 나면 flag가 출력될텐데 recv()함수를 사용해서 출력해준다.

 


이렇게 pwn 모듈을 사용해 간단한 파이썬 코드로 쉽게 플래그를 얻어낼 수 있다.

이처럼 활용도 높은 파이썬을 서울대고 연세대고 성균관대도 전부 채택해서 가르치는데 왜 우리 학교만 C랑 자바만 고집하는지 의문이다..

아무튼 이렇게 풀이를 마친다.

728x90
반응형

댓글