먼저 hint의 코드를 분석해보자. main 함수가 정의되어 있고 char 유형의 80byte bleh가 선언되었다. setreuid 함수를 사용하여 권한을 최종으로 바꾸어주며, fgets 함수를 통해 표준입력으로 79byte 만큼의 내용을 bleh에 입력한다. 여기서 버퍼 오버플로우는 일어나지 않는다. 마지막으로 printf 함수로 이 내용을 출력하며 끝난다. 이번 코드는 버퍼 오버플로우 취약점은 발견되지 않지만 bleh를 출력하는 과정에서 유형을 지정해주지 않았으므로 포맷 스트링 버그 취약점을 활용하는 문제라고 추측할 수 있다. gdb를 사용하여 main 함수를 분석하려 하였으나 Main의 symbol이 없다는 내용이 출력된다. AAAA 문자를 입력하면 그대로 출력하고 %..
level19의 힌트를 확인하였다. bash shell의 실행이나 권한을 상승시키는 코드가 없으므로 만들어야 한다. 코드의 내용을 보자면 char 유형의 buf 20byte를 만들었고, gets 함수를 사용하여 값을 가져오지만 크기를 제한하지 않으므로 오버플로우가 발생할 수 있다. 코드를 분석하기 위해 tmp 디렉토리로 복사했다. 메인 함수에 0x28(40byte) 만큼이 할당되어 있다. buf (20) + bummy(20) + SEP (4) + RET (4) 으로 생각할 수 있다. 총 44byte의 "A" 값을 채운 후 RET의 자리에 환경변수의 주소값을 대입하면 된다. setuid를 실행하는 코드를 짜서 해보려 했는데 생각처럼 작동하지 않아서 setuid를 ..
코드가 평소보다 길어서 당황했지만 분석을 해보자면 void형의 shellout 함수, int형의 main 함수가 선언되어 있다. shellout 함수는 setuid 함수로 level19 권한으로 바꿔주며 배쉬 쉘을 실행시키는 역할을 한다. mainf 함수에는 char형의 100byte 리스트 string, int형의 check/ x/ count, fd_set 구조체 fds가 선언되어 있고, x와 count는 0으로 초기값이 초기화 되어 있다. if 문을 통해 count가 100 이상일 경우 "what are you trying to do" 를 출력하여 이상한 동작임을 알려준다. if 문을 통해 check의 값이 0xdeadbeef일 경우 shellcout() 함수로 쉘을 실행한다. 나는 she..
level16과 동일하게 attackme, hint 파일이 존재한다. 먼저 printit() 함수가 선언되었다. printf를 사용하여 "Hello there!"를 출력한다. main()함수가 선언되었다. int형의 carp, void형의 함수 포인터 printit이 선언되었고. char형의 buf 리스트가 20byte 크기로 선언되어 있다. fget 함수를 사용하여 표준 입력 방식으로 48byte를 buf에 대입한다. setsuid 함수로 권한을 level18로 바꾼 후에 call 함수를 호출하며 main 함수가 끝난다. buf는 20byte이나 fgets에서 48byte를 대입하므로 오버플로우가 발생할 수 있다. 지난번 문제와의 차이점은 shell을 실행하는 부분이 없다. 때문에 환경변수를..