호그와트

흠냐

영웅*^%&$ 2023. 6. 29. 12:01
728x90

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <signal.h>

#define FLAGSIZE_MAX 64

char flag[FLAGSIZE_MAX];

void sigsegv_handler(int sig) {

printf("%s\n", flag);

fflush(stdout);

exit(1);

}

void vuln(char *input){

char buf2[16];

strcpy(buf2, input);

}

int main(int argc, char **argv){

 

FILE *f = fopen("flag.txt","r");

if (f == NULL) {

printf("%s %s", "Please create 'flag.txt' in this directory with your",

"own debugging flag.\n");

exit(0);

}

 

fgets(flag,FLAGSIZE_MAX,f);

signal(SIGSEGV, sigsegv_handler); // Set up signal handler

 

gid_t gid = getegid();

setresgid(gid, gid, gid);

printf("Input: ");

fflush(stdout);

char buf1[100];

gets(buf1);

vuln(buf1);

printf("The program will exit now\n");

return 0;

}

코드 출처 : picoCTF, buffer overflow 0

사실 이 코드만 봐도 알 수 있다시피 이 코드 자체의 취약점은 너무나 명백하다.

(otter은 로컬에서 내가 자체로 정한 flag 내용이다)

그렇기에 아주 단순한 공격에도 바로 flag를 내뱉는다.

코드를 아래와 같이 패치한다

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <signal.h>

#define FLAGSIZE_MAX 64

char flag[FLAGSIZE_MAX];

void sigsegv_handler(int sig) {

printf("%s\n", flag);

fflush(stdout);

exit(1);

}

void vuln(char *input){

char buf2[16];

strncpy(buf2, input, sizeof(buf2)-1);

buf2[sizeof(buf2)-1] = '\0'; // Ensure null-termination

}

int main(int argc, char **argv){

 

FILE *f = fopen("flag.txt","r");

if (f == NULL) {

printf("%s %s", "Please create 'flag.txt' in this directory with your",

"own debugging flag.\n");

exit(0);

}

 

fgets(flag,FLAGSIZE_MAX,f);

signal(SIGSEGV, sigsegv_handler); // Set up signal handler

 

gid_t gid = getegid();

setresgid(gid, gid, gid);

printf("Input: ");

fflush(stdout);

char buf1[100];

fgets(buf1, sizeof(buf1), stdin); // Replace gets with fgets

vuln(buf1);

printf("The program will exit now\n");

return 0;

}

기존의 공격은 통하지 않는다.

그러나 이 패치된 코드도 안전하다는 뜻은 아니다.

이 코드 자체에는 이런 식으로는 해결되지 않는 본질적인 취약점이 2가지가 존재하기 때문이다.

그러나 어쨋든 기본적인 버퍼 오버플로우는 패치되었다.

728x90