security/포너블 - dreamhack

[Dreamhack Wargame] Stupid GCC

민사민서 2023. 6. 14. 21:41

출제의도 - GCC 컴파일 옵션을 활용하여 의도치않은 동작을 하는 a.out 생성

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

이 코드를 컴파일하여 if(v2>10000) 통과되는 a.out을 생성하여야 함

 

마이 풀이

- optimization level 2 혹은 3으로 옵션을 주면 v1이 10 이후로도 계속 증가함!

$ gcc -O2 ./a.c
$ gcc -O3 ./a.c

이유는 잘 모르겠지만 v1<10을 항상 true라고 가정하고 optimizing 진행

 

어떻게 gcc 멋대로 optimizing하는 걸 방지하냐?

 

volatile 키워드 in C++

volatile로 선언된 변수는 외부적인 요인으로 그 값이 언제든지 바뀔 수 있음을 뜻한다. 따라서 컴파일러는 volatile 선언된 변수에 대해서는 최적화를 수행하지 않는다. volatile 변수를 참조할 경우 레지스터에 로드(캐싱)된 값을 사용하지 않고 매번 메모리를 참조

https://skyul.tistory.com/337

Basically, volatile announces that a value might change behind your program's back. That prevents compilers from caching the value (in a CPU register) and from optimizing away accesses to that value when they seem unnecessary from the POV of your program.

 

드림핵 풀이들

1. 파이프라인과 -x c 옵션 이용하여 직접 c코드를 작성 및 컴파일

echo -e '
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>

int main()
{
    chmod("/flag.txt", 07777);
}' |  gcc -o a.out -x c -

2. -D 옵션 이용하여 매크로 지정

gcc -D"if(x)=if(1)" a.c

 

'security > 포너블 - dreamhack' 카테고리의 다른 글

[Dreamhack Wargame] Cat-Jump  (0) 2023.06.15
[Dreamhack Wargame] STB-lsExecutor  (0) 2023.06.15
[Dreamhack Wargame] awesome_basic  (0) 2023.06.15
[Dreamhack Wargame] FSB_Overwrite  (0) 2023.06.14
[Dreamhack Wargame] Master Canary  (0) 2023.06.14