문제 설명


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번 더한다.

그냥 코드 짜서 풀어야 되는 문제 같음. 

 

문제 힌트에 pwntools 쓰라고 하니까 저걸 써야 확실히 문제 풀이가 편해질 것 같다.

분명 전에 이런 거 한 번 풀어봤던 것 같은데 까먹어서 다시 검색해 봤음

https://tekiter.tistory.com/4 

 

Pwntools 기본 사용법

Pwntools 소개 Pwntools 는 리눅스 환경에서 익스플로잇을 짜는 것을 쉽게 할 수 있게 해주는 파이썬 라이브러리다. 공식 Github 주소 : https://github.com/Gallopsled/pwntools 공식 문서 주소 : http://docs.pwntools.com

tekiter.tistory.com

이 블로그를 참고해서 pwntools 사용법을 공부했다.

 

pwntools 다운로드 완료.

사실 이 다음부터는 그냥 랜덤한 두 수를 뽑아 50번 계산하는 코드를 짜는 게 끝이다. 

pwntools를 사용하는 것이기 때문에, 코드의 첫 줄에는

'form pwn import *' 라는 걸 꼭 써 줘야 한다. 

 

그 다음에는 그냥 드림핵 환경에서 생성된 서버와 포트 번호를 입력해 문제 자체에서 제공하는 코드를 가져오고,

총 50번 반복하는 코드를 짠다.

split을 이용해 +을 기준으로 num1과 num2를 나누고, 해당 두 수를 더한 값을 result로 넣는 것이다.

 

pwntools를 활용해 본다는 데에 의의가 있는 문제라서, 코드는 그냥 단순 덧셈이라 별로 어려울 건 없는 것 같당

 

코드 실행하려면

python3 "내가 생성한 코드 이름" << 형식으로 명령어 입력해 주면 되고, 

그 뒤로는 저절로 문제 코드 따라서 큰 수 덧셈을 50번 반복한다.

 

코드만 제대로 짰으면 큰 무리 없이 계산에 성공하고 플래그를 얻을 수 있다 ~.~

풀이 성공!

'SWUFORCE > 워게임 풀이' 카테고리의 다른 글

[Dreamhack] rev-basic-0 (reversing)  (0) 2024.08.27
[Dreamhack] file-special-bit (misc)  (0) 2024.08.20
[Dreamhack] whatsdifferent (misc)  (0) 2024.08.06
[Dreamhack] littlevsbig (misc)  (0) 2024.08.06
[Dreamhack] image-storage (web)  (1) 2024.07.22

+ Recent posts