https://dreamhack.io/wargame/challenges/749
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main() {
uint8_t v1 = 0;
int v2 = 0;
char v3[31];
uint16_t v4[10]={0,};
while (v4[v1] < UINT16_MAX && v1 < 10) {
v1++;
printf("v4[%d]: %p\n", v1, &v4[v1]);
v2 += v1;
if (v2 > 10000) {
FILE *fp = fopen("/flag.txt", "r");
fgets(v3, 31, fp);
fclose(fp);
fp = fopen("/home/stupid_gcc/flag.txt", "w");
fwrite(v3, 31, 1, fp);
fclose(fp);
return 0;
}
}
return 0;
}
v1이 10번 반복하는 동안 v2 += v1을 해주고 배열 값을 출력한다.
이때 v2가 10000이상이면 flag.txt를 읽어 현재 디렉토리에 파일을 작성해준다.
--> 10000이라는 숫자를 바꿔주면 되지 않을까?
문제 창을 들어가보면 이런 문구가 쓰여져 있다.

일단 파일을 실행해보았다.

그 다음 상위 폴더로 가보았지만... 아무것도 생기지 않길래 찾아보니 root계정으로 저 ssh에 접근하는 것이였다.

gcc ./a.c 를 해서 a.out 파일을 생성한다.

그 다음 상위폴더로 가보면 anonymous라는 파일이 있길래 들어가보았으나.. 아무것도 없었다.


한번 더 상위폴더로 가보니 flag.txt라는 파일이 있었다.
cat flag.txt 를 해보았으나 접근이 되지 않았다.

아까 코드분석을 한 것과 같이 v2의 범위를 낮추면 되는데 어떻게 낮춰야 할지 잘 떠오르지 않았다.
그래서 찾아보니 gcc -O3 a.c를 해주게 되면 flag.txt가 복사되어 현재 디렉토리에 저장된다는 것을 알게 되었다.
1. gcc 최적화 옵션
-O1: O 옵션과 같은 단계의 옵션. 최소한의 스레드 분기 동작 횟수를 줄이고, 호출된 각 함수 반환 시 스택에 인수를 모아 두었다 동시에 꺼낸다.-O2: O1 단계의 최적화와 함께 프로세서가 다른 명령어의 결과나 캐시 메모리 또는 메모리의 데이터를 기다리는 동안 컴파일러가 다른 명령어를 실행하도록 한다. 컴파일 시간이 더 오래 걸리지만, 수정된 코드는 더 최적화되어 실행이 빨라진다.-O3: -O2 단계의 모든 최적화와 루프 해체, 그 밖의 프로세서 전용 특징을 포함

