워게임

math.c write-up

sewoo-jjang 2026. 1. 16. 18:57

math.zip
0.00MB

1. 소스코드 분석

#include <stdio.h>
#include <time.h>


int main() {
	int i;
	int a;
	int b;
	int answer;

	setvbuf(stdout, NULL, _IONBF, 0);
	setvbuf(stdin, NULL, _IONBF, 0);
	setvbuf(stderr, NULL, _IONBF, 0);
	
	srand(time(NULL));
	
	for (i = 0; i < 10000; i++) {
		a = rand() % 99 + 1;
		b = rand() % 99 + 1;
		
		printf("stage %d | %d+%d = ", i+1, a, b);
		scanf("%d", &answer);
		
		if (answer != a+b) {
			puts("Wrong answer!");
			exit(0);
		}
		else continue;
	}
	puts("Access is allowed!");
	return 0;
}
  • 소스코드를 확인해보니 Access is allowed! 라는 말이 뜨게 되면 성공인 것으로 확인되었다.
  • 총 10000번동안 랜덤값 산수를 진행하는데, 한번이라도 틀리면 프로그램이 종료됨을 확인할 수 있다.

2. 프로그램 실행

실행권한 부여

실행하기 앞서 이미 컴파일되어있는 math파일에 실행권한이 있는지 확인해보자.

  • 만약 보이는것과같이 실행권한이 없다면 실행권한을 부여하고 진행하도록 하자.
chmod +x math

  • 실행권한이 처음부터 있었다면 해당 작업은 건너뛰어도 무관하다.

프로그램 살펴보기

  • 프로그램을 보면 보이는것과같이 stage n | 숫자+숫자 = 형식으로 계속해서 질문하는것을 확인할 수있다.
  • 한번이라도 틀린다면 프로그램은 그대로 종료하기에 산수에 고수가 아니라면 다른 방법이 필요할 것이다.

3. payload 작성

  • 해당 프로그램을 완료하기 위해선 자동화 툴이 필요할 듯 하다.
  • 고로 pwntools 이라는 파이썬 라이브러리를 사용하도록 하자.

pwntools 사용방법은 해당 블로그를 참고하도록 하자

https://hg2lee.tistory.com/entry/Pwntools-사용법

 

Pwntools 사용법

포너블(시스템 해킹)을 하면서 많은 기능을 제공해주는 Pwntools는 엄청 많은 도움이 되며, 정말 Exploit에 큰 도움이 된다. pip를 통해 설치후에 Exploit 파일인 .py 내에서 사용이 가능하며, 불러오기

hg2lee.tistory.com

  • math를 실행해보았을 때 보내오는 형식이  stage n | 숫자+숫자 = 이기에 전까지 받아서 앞의 숫자를 구하고 + = 사이를 받아서 뒤의 숫자를 구한 뒤 이 두 숫자를 더해 다시 보내주는 형식이면 해결할 수 있을것이라 예상된다.
from pwn import *

p = process('./math')

for i in range(10000):
    print(p.recvuntil(b' | '))
    a = int(p.recvuntil(b'+')[:-1])
    b = int(p.recvuntil(b' =')[:-2])
    ans = a+b

    p.recv()
    p.sendline(str(ans).encode())
p.recv()
  • 해당 코드를 조금 더 설명하자면 변수 a는 + 까지 받아오기에 [:-1]을 붙여 +를 제거하였고 변수 b는  = 까지 받아오기에 [:-2]를 붙여 제거해 주었다.

결과