Level20 풀이. pw = 'we are just regular guys' 드디어 마지막 20번이다. 일단 문제 접근을 위해 hint를 본다. 짧다....................................... 좋다. 일단 c언어 소스 코드가 존재한다. 한 줄씩 해석해보면 int argc, char **argv는 프로그램 실행과 동시에 사용자 입력 받는다. char bleh[80] 문자형 bleh 변수에 80byte 만큼의 크기를 할당. setreuid(3101, 3101) 다음 단계의 권한이다. fgets(bleh,79,stdin) fgets 함수로 bleh 변수에 79byte 만큼의 사용자 입력을 받는다. printf(bleh) bleh 변수에 저장된 값 출력된다. fgets 함수로 문자열..
# Related site issues/FTZ
Level19 풀이. pw = 'swimming in pink' 일단 언제나 그랬듯이 문제 접근을 위해 hint를 본다. 뭔가 코드가 짧아졌다 일단 해석해보자면, char buf[20]은 문자형 buf 변수에 20byte의 크기를 할당한다는 뜻이고, gets(buf)는 gets 함수를 통해 buf변수에 사용자 입력을 받는다. printf(“%s\n”, buf); buf 내용을 출력한다. 일단 gets 로 인해 취약점이 생기는 것은 예제들을 통해 알 수 있고 근데 맨날 있던 setreuid( 숫자 어쩌구~~~~)가 안 보인다. setreuid를 알아내야 한다. 이럴 때 쓰는 방법이 chaining return to lib 기법 인데 구글링 참조했다. 일단 그러면 buf에서부터 ret 까지의 거리를 알아야 ..
Level18 풀이. pw = 'why did you do it' 일단 문제 접근을 위해 hint를 본다. 순간 hint가 아닌 줄 알았다. 아마 FTZ 문제 중에 hint가 제일 길 것이다.후...하나하나 보자면, char string[100]은 문자형으로 string 변수에 100byte 만큼 크기를 할당한다는 것이고, int check는 int형으로 check 변수 선언한 것이고, int x = 0; int형으로 x변수 선언과 0 저장한다는 것. fd_set fds;(구글링 참조) 관리하는 파일의 지정번호가 등록되어 있는 비트 배열 구조체. printf(“enter your command”) enter your command를 출력한다는 것이다.fflush(stdout)(구글링 참조) stdout에..
Level17 풀이. pw = 'king poetic' 일단 문제 풀이를 위해 hint를 본다. level16과 비슷해 보이는데, 쉘이 없어지고, SETREUID가 메인에 들어왔다. void printit()는 printit 함수가 선언, printf(“Hello there! \n”) hello there! 이라는 구문 출력. int crap은 int형 변수 crap 선언. void(*call)()=printit은 *call 포인터 함수에 printit 함수 주소 저장. char buf[20]는 문자형 buf 변수에 20byte 할당. fgets(buf,48,stdin) fgets 함수를 사용해 buf 변수에 48바이트 만큼 할당. setreuid(3098, 3098) level18의 권한 같다. cal..
Level16 풀이. pw = 'about to cause mass' 일단 c 코드가 나왔는데 본 것도 있고, 처음 보는 것도 있다. 슥 보니 fgets가 있는 것으로 보아 버퍼 오버플로우가 발생할 것이다. 한 줄씩 분석해보자. 일단 void shell()은 shell이라는 함수가 있는 정도가 setreuid(3097,3097)은 shell이 실행되면 다음 level17 권한으로 실행되는 것으로 보인다. system(“/bin/sh”) 은 /bin/sh의 쉘을 실행한다. void printit()는 printit 함수이고, printf(“hello there!\n”); 주어진 hello there!를 출력.main 아래부터 설명하면, int crap은 변수 crap를 선언. void(*call)()=pr..
Level15 풀이. pw = 'guess what' 일단 문제 접근을 위해 hint를 본다. 일단 c코드인건 맞는데, 그 전과 다르게 check 변수를 포인터 변수로 선언해줬다는 것이다. 포인터 변수의 가장 중요한 것은 메모리의 주소 값을 가지는 변수라는 것이다. 또 level14와 같이 level14와 같이 fgets이 있는 걸 봐서는 버퍼 오버 플로우가 발생하는 것 같다. 일단 한 줄씩 보자. int crap; 는 int형 변수인 crap 선언. int *check;은 int 형 포인터 변수 check를 선언, char buf[20] 문자형 buf 변수에 20바이트 크기 할당. fgets(buf,45,stdin) fgets 함수로 45바이트만큼의 입력을 buf 변수로 받음. if(*check==0x..
Level14 풀이. pw = 'what that nigga want?' 일단 문제 접근을 위해 hint를 본다. 이것도 새로운 것이 나왔으니 한 줄씩 분석.1번째 줄은 int crap = int형 crap 변수 선언.2번째 줄은 int check = int형 check 변수 선언.3번째 줄은 char buf[20] = buf[20] 변수 선언.4번째 줄은 fgets(buf, 45, stdin) = 문자열을 45바이트까지 buf 배열에 저장. 5번째 줄은 if ~~~~는 setreuid ~~~~ system = check 변수에 0xdeadbeef 값이 들어 있을 경우, 3095은 level15 같다. 대충 보니 check 변수에 0xdeadbeef 값 저장하라는 뜻 같다. check 변수가 초기화되어 ..
Level13 풀이. pw = 'have no clue' 일단 문제 접근을 위해 hint를 본다. C코드가 등장했고, 좀 새로운 개념들이 나왔으니, 분석해보겠다. 1번째 long I = 0x1234567; = long 타입의 변수 I를 선언하고, 0x1234567 값으로 초기화 시킨다. 2번째 char buf[1024]; = buf라는 이름의 1024 크기를 가진 배열 선언.3번째 setreuid( 3094, 3094 ); level 12에서 봤던 다음 레벨의 권한 같다.4번째 if(argc>1) strcpy(buf, argv[1]); = 프로그램이 실행되면, 인자 값을 buf[1024]에 복사.5번째 if(i != 0x1234567)l, printf ~~~는, kill ~~는 값이 0x1234567 인..