목록War Game/FTZ (9)
tmxklab
1. 문제확인 1) 사용자 및 패스워드 : level19 / swimming in pink 2) 파일확인 3) hint 코드 설명 main() { char buf20]; gets(buf); printf("%s\n", buf); } gets()를 통해 buf에 사용자의 입력 값을 넣고 printf()로 출력시키는 단순한 코드 gets()로 인해 buf배열의 크기(20bytes)보다 더 큰 입력을 받을 수 있음 -> bof 취약점 존재 2. 접근방법 1) attackme 디버깅 : gets함수의 인자인 buf가 gets함수 호출하기전에 push하므로 [ebp-40]위치에 buf변수 존재 2) 스택구조 3) 결론 gets()를 통해 buf배열의 크기(20bytes)보다 더 큰 값을 받을 수 있음 RTL공격기법..
1. 문제확인 1) 사용자 및 패스워드 : level18 / why did you do it 2) 파일확인 3) hint 코드 설명 #include #include #include #include void shellout(void); int main() { char string[100]; // 사용자의 입력받은 문자열을 저장하는 배열 int check; int x=0; // 사용자의 입력을 1byte씩 저장하는 변수 int count=0; // string배열에서 인덱스 역할 fd_set fds; // 파일 디스크립터(fd)를 저장하는 구조체 변수 선언(배열 형태) printf("Enter your command: "); fflush(stdout); // 출력 버퍼를 비움 while(1) { // 밑에 ..
1. 문제확인 1) 사용자 및 패스워드 : level17 / king poetic 2) 파일확인 3) hint 코드 설명 #include void printit(){ printF("Hello there!\n"); } main() { int crap; void (*call)()=printit; char buf[20]; fgets(buf, 48, stdin); setreuid(3098, 3098); call(); } fgets()로 인해 buf[20bytes]배열의 크기보다 더 큰 입력을 받을 수 있음 -> bof 취약점 존재 Level16과 달리 shell()가 사라지고 printit()만 존재 2. 접근방법 1) attackme 디버깅 : [ebp-16]에 0x8048490(printit()의 시작 주소..
1. 문제확인 1) 사용자 및 패스워드 : level16 / about to cause mass 2) 파일확인 3) hint 코드 설명 #include // level17 쉘 권한 획득할 수 있는 함수 void shell(){ setreuid(3097, 3097); system("/bin/sh"); } void printit(){ printf("Hello there!\n"); } main() { int crap; void (*call)()=printit; // 함수 포인터call변수가 printit함수의 주소를 가리킴 char buf[20]; fgets(buf, 48, stdin); call(); // printit함수 호출 } shell()은 level17 쉘 권한을 획득할 수 있는 함수이며 print..
1. 문제확인 1) 사용자 및 패스워드 : level15 / guess what 2) 파일확인 3) hint 코드 설명 #include main() { int crap; int *check; char buf[20]; fgets(buf, 45, stdin); if(*check==0xdeadbeef) { setreuid(3096, 3096); system("/bin/sh"); } } Level14와 구조는 비슷하지만 check변수가 포인터 변수임 2. 접근방법 1) attackme 디버깅 level14와 달리 level15에서는 check가 포인터 변수로 사용하므로 바로 [ebp-16]과 0xdeadbeef랑 비교하는 것이 아니라 [ebp-16]의 값을 주소로 사용하여 한번 더 들어가게 됨 if문에 0xde..
1. 문제확인 1) 사용자 및 패스워드 : level14 / what that nigga want? 2) 파일확인 3) hint 코드 설명 #include #include main() { int crap; int check; char buf[20]; fgets(buf, 45, stdin); if(check==0xdeadbeef) { setreuid(3095, 3095); // level15의 ruid, uid값으로 변경 system("/bin/sh"); // } } 프로그램 실행 후 fgets함수를 통해 사용자의 입력을 받을 수 있음(stdin) buf변수의 20bytes보다 더 큰 입력 값을 넣을 수 있음 → bof 취약점 존재 2. 접근방법 1) attackme 디버깅 함수의 프롤로그(push ebp..
1. 문제확인 1) 사용자 및 패스워드 : level13 / have no clue 2) 파일확인 3) hint 코드 설명 #include main( int argc, char *argv[] ) { long i=0x1234567; char buf[1024]; setreuid(3094, 3094); // "./attackme [인자값]"인 경우 argc는 2, argv[0]은 "./attackme", argv[1]은 "인자값" // 즉, 인자 값을 buf에 복사 if(argc > 1) strcpy(buf, argv[1]); // 이미 0x1234567로 초기화된 i값이 아니라면 if문 실행 // kill함수의 첫 번째 인자는 프로세스 id, 두 번째 인자는 프로세스id if(i!=0x1234567){ pr..
1. 문제확인 1) 사용자 및 패스워드 : level12 / it is like this 2) 파일확인 3) hint 코드 설명 #include #include #include int main( void ) { // char형 str변수 256바이트 할당 char str[256]; // 실제 사용자 ID와 유효 사용자 ID 3093로 설정 setreuid(3093, 3093); printf("문장을 입력하세요.\n"); // 사용자 입력을 통해 str변수에 저장 gets(str); printf("%s\n", str); } 프로그램 실행시에 gets()를 통해 사용자의 입력을 받을 수 있음 str배열의 크기(256bytes)보다 더 큰 입력 값을 넣을 수 있음 -> bof취약점 존재 2. 접근방법 1) a..
1. 문제 확인 1) 사용자 및 패스워드 : level11 / what!@#$? 2) 파일 확인 3) hint 코드 설명 #include #include // argc, argv를 통해 인자 값을 받아 실행 int main( int argc, char *argv[]) { // char형 str변수 256바이트 할당 char str[256]; // 실제 사용자 ID와 유효 사용자 ID 3092로 설정 setreuid(3092, 3092); // argv[1]인자 값을 str변수에 복사 strcpy(str, argv[1]); printf(str); } - 프로그램 실행 시 인자 값을 받아 str배열에 복사한 뒤 출력해주는 코드 - strcpy()에서 str배열의 크기(256bytes)보다 더 많은 값을 ar..