목록System (28)
SH1R0_HACKER
Off-by-one 취약점은 경계 검사에서 하나의 오차가 있을 때 발생하는 취약점입니다. // off-by-one-1.c #include void copy_buf(char *buf, int sz) { char temp[16]; for(i = 0; i
OOB (Out Of Boundary)는 버퍼의 길이 범위를 벗어나는 인덱스에 접근할 때 발생하는 취약점 입니다. 다음은 첫 번째 예제입니다. // oob-1.c #include int main(void) { int win; int idx; int buf[10]; printf("Which index? "); scanf("%d", &idx); printf("Value: "); scanf("%d", &buf[idx]); printf("idx: %d, value: %d\n", idx, buf[idx]); if(win == 31337){ printf("Theori{-----------redacted---------}"); } } scanf 함수로 idx 값을 저장하고 buf[idx]에 입력한 값을 저장합니다. ..
보호되어 있는 글입니다.
id : darkknight password : new attacker [bugbear.c] /* The Lord of the BOF : The Fellowship of the BOF - bugbear - RTL1 */ #include #include main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] == '\xbf') { printf("stack betrayed you!!\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } 40byte의 buffer 변수를 생성했고 argv[..
첫 번째 예시입니다. // stack-1.c #include #include int main(void) { char buf[16]; gets(buf); printf("%s", buf); } 위 코드를 볼 때 gets() 함수에 별도의 길이 제한이 없기 때문에 16바이트를 넘는 데이터를 입력한다면 스택 버퍼 오버플로우가 발생합니다. 버퍼에 16byte만큼 A를 입력하고 추가로 BBBBCCCC를 입력하자, SFP가 0x42424242로, RET가 0x43434343로 바뀐 모습을 볼 수 있습니다. 이와 같이 스택 버퍼 오버플로우는 프로그램이 스택에 위치한 버퍼에 할당된 것보다 더 많은 데이터를 쓸 때 발생합니다. 버퍼 오버 플로우 취약점은 길이 제한이 없는 API 함수들을 사용하거나 버퍼의 크기보다 입력받는..
id : golem password : cup of coffee [ darkkinght.c ] /* The Lord of the BOF : The Fellowship of the BOF - darkknight - FPO */ #include #include void problem_child(char *src) { char buffer[40]; strncpy(buffer, src, 41); printf("%s\n", buffer); } main(int argc, char *argv[]) { if(argc
id : skeleton password : shellcoder [ golem.c ] /* The Lord of the BOF : The Fellowship of the BOF - golem - stack destroyer */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] != '\xbf') { printf("stack is still your friend.\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffe..
id : vampire password : music world [ skeleton.c ] /* The Lord of the BOF : The Fellowship of the BOF - skeleton - argv hunter */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i, saved_argc; if(argc < 2){ printf("argv error\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(argv[1][47] != '\xbf') { p..
id : troll password : aspirin [ vampire.c ] /* The Lord of the BOF : The Fellowship of the BOF - vampire - check 0xbfff */ #include #include main(int argc, char *argv[]) { char buffer[40]; if(argc < 2){ printf("argv error\n"); exit(0); } if(argv[1][47] != '\xbf') { printf("stack is still your friend.\n"); exit(0); } // here is changed! if(argv[1][46] == '\xff') { printf("but it's not forever\n")..
id : orge password : timewalker [ troll.c ] /* The Lord of the BOF : The Fellowship of the BOF - troll - check argc + argv hunter */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; // here is changed if(argc != 2){ printf("argc must be two!\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(argv[1][..