hacking sorcerer
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
반응형