level10을 통해 얻은 비밀번호로 level11에 접속하여 힌트를 읽어보자. 여태 공격성 문제에서는 system 함수를 공략하는 문제가 나왔다면 이제부터는 system 함수가 없어도 공격을 하는 방법에 대해서 찾아야 한다. 해당 문제에서는 printf를 보고 printf 와 관련된 취약점에 대해서 검색해 보았고 포맷 스트링 어택이라는 공격 기법을 사용하는 것을 깨달았다. attackme 프로그램에 대해서 분석해본 결과 우선 esp의 사이즈가 0x108(264)이라는 것을 알 수 있고 변수 선언을 256사이즈로 했다는 것을 감안하면 8바이트는 dummy로 추측이 된다. 또한 sfp와 ret의 8바이트를 추가하면 256(buffer),8(dummy),4(SFP),4(RET) 구조가 된다. 여기서 리턴하는..
우선 level9에서 얻어온 비밀번호를 통하여 접속을 하고 힌트에 대한 정보를 확인해보았다. 평소와는 다르게 program이라는 디렉토리가 존재하지만 접근 권한을 가지고 있지 않아 접근할 수 없는 파일이다. 가장 중요하게 생각한 파트는 공유 메모리라는 점이었다. 만약 공유메모리를 어느 프로세스에서 생성하였다면, 다른 프로세스들은 key_t값을 알고 있는 순간 접근이 가능하게 된다. 이때 필요한 c 함수로는 shmget이라는 함수가 요구된다. 다음은 http://forum.falinux.com/zbxe/index.php?document_srl=423456&mid=C_LIB 에서 보여준 shmget 예제 코드를 응용한 코드이다. 제공받은 ket_t값을 이용하여 공유메모리에 접근하고 해당 내용에 대해서 출력하..
level8에서 얻은 비밀번호를 통하여 level9를 접속하고 힌트를 읽어보았다. 버퍼 오버플로우를 이용한 공격 문제이다. fgets 함수로 buf 변수에 대해서 입력을 받지만 조건문으로 참고하는 대상은 buf2 변수이다. 따라서 우리는 buf 변수에 값을 입력하여 buf2 변수에 원하는 위치에 데이터를 입력해주어야 하는 것이 가장 큰 목표이다. 따라서 현재 buf와 buf2의 메모리의 위치를 정확하게 알아야 한다. 그래서 gdb를 이용하여 분석을 실시하였다. 어셈블리에서는 항상 변수에 정보를 저장하기 위한 함수를 사용하기 전에 해당 변수의 메모리 주소를 불러와야 한다. 따라서 fgets 함수를 사용하기 전 불러온 변수 buf 의 메모리 주소를 확인해보면 0xffffffd8이라는 것을 알 수 있으며 bu..
level7에서 얻은 비밀번호로 level8에 접속하여 힌트를 우선 읽어보자. 힌트는 파일이 어딘가에 존재한다는 점과 파일의 용량이 2700이라는 점이었다. 파일을 검색하기 위해서는 find 명령어를 사용해야하는데 용량을 기준으로 검색하기 위해서는 -size 옵션을 부여해야했다. 그래서 사용한 명령어는 find / -size 2700 2> /dev/null 이었다. 하지만 아무것도 찾을 수 없다는 이야기에 당황을 했고 다시 find 함수에 대해서 조사를 해보았다. 결과적으로 size에 대해서 단위를 지정해줘야 하는 점을 착각했다. ls -l 옵션에서 나오는 용량의 단위는 바이트 단위이다. 따라서 바이트 단위로 맞춰주면서 검색을 해야한다. 이를 위해서 바이트 단위 표기법으로 수정하여 find / -size..
level6에서 얻은 비밀번호를 통해 level7에 접속하고 힌트를 읽어보자. /bin/level7에 대하여 자세한 정보를 확인해보자. 실행가능한 파일임을 깨닫고 어떤 구성으로 되어있는 파일인지 디스어셈블링을 수행하였다. 우선 최초의 printf로 출력하는 내용을 확인해보았다. 패스워드를 입력하라는 문구와 함께 입력대기 상태에 놓이게 된다. 임의의 패스워드를 입력했을 경우 strncmp로 검색을 하게 되는데 이때 비교하게 되는 값은 mate이다. 즉, 패스워드는 mate를 입력하게 되면 해결된다. 만약에 입력한 패스워드가 mate일 경우 다음 단계인 level8의 비밀번호를 출력하고 프로그램은 종료가 된다. 만약에 비밀번호가 틀렸을 경우에는 다음과 같은 명령어를 system 함수로 수행하고 종료가 된다...
level6의 경우에는 로그인을 하자마자 힌트가 나오면서 프로그램이 입력대기 상태에 놓이게 된다. 별도의 명령어를 수행할 수 없는 상태가 된다. 현재 프로그램이 자동으로 실행된 상태로 무한정 대기상태이면 원하는 명령어를 입력할 수 없으므로 현재 프로그램을 종료시키도록 해야한다. 현재 프로그램을 종료하는 방법으로 SIGINT인 Ctrl + C를 입력하여 프로세스를 종료해보았다. level6의 쉘을 얻게되었다. 그렇다면 현재 디렉토리를 살펴보도록하자. 평소와는 다른 2개의 파일이 보인다. password와 tn이다. 우선 tn은 실행할 수 있는 파일이기에 실행해보도록 하겠다. 처음 로그인을 했을 때 자동으로 실행된 파일임을 알 수 있다. password파일은 cat로 열람해본 결과 다음 단계로 넘어갈 수 있..
level4에서 취득한 비밀번호를 통해서 level5 로 로그인을 하고 마찬가지로 hint를 확인해보자. 힌트에서 제공한 /usr/bin/level5 라는 파일이 실제로 존재하는지 확인해보자. 다음과 같으 힌트에서 제공한 파일이 실제로 존재하는 것을 알았고 level6의 권한을 가지고 있다는 것을 알 수 있다. 또한 실행가능한 파일임을 알고 디스어셈블링을 수행하여 어떤 흐름을 지닌 파일인지 확인해보도록 하겠다. 우선 최초에 수행되는 함수는 creat로 파일을 생성하는 함수이다. 파일 생성의 이름을 확인해보면, /tmp/level5.tmp라는 파일을 생성한 것을 확인할 수 있다. 그리고 나서 0x0804852d : cmpl $0x0,0xfffffffc(%ebp) 을 통하여 파일이 정상적으로 만들어 졌는지 ..
지난 level3에서 얻은 level4의 암호를 입력하고 접속하여 평소대로 hint를 읽어보자. /etc/xinetd.d/ 에 백도어를 심어놓았다는 힌트가 존재한다. 우선 해당 디렉토리를 점검해보자. level4의 권한을 가진 backdoor라는 파일을 확인할 수 있다. 우선 xinetd.d 의 역할과 xinetd의 기능을 알아야 한다. 간단하게 설명을 하자면 네트워크 접속을 제어하는 서비스를 제공하며 대표적인 서비스로는 telnet이 있다. xinetd의 전체적인 설정파일은 /etc/xinetd.conf에 있고 해당 파일의 최하단에는 includedir /etc/xinetd.d가 적혀있는 것을 확인할 수 있는데 이는 xinetd에서 제공하는 서비스들이 모여저 있는 곳을 설명하는 것이다. 대표적인 예시로..
우선 레벨3 계정으로 접속하여 마찬가지로 hint를 확인해본다. 다음과 같은 hint를 얻을 수 있다. 그렇다면 우선 autodig이라는 프로그램이 어디에 위치하는지 찾아야 한다. 해당 프로그램의 위치를 찾았고 level4의 권한을 지닌 프로그램이라는 것을 알았다. 또한 실행할 수 있는 프로그램이므로 디스어셈블링을 수행하여 hint 와 비슷한지 확인을 해야한다. 0x0804851a : je 0x804854c 문에서 je는 윗줄에서 cmpl 문이 합당할때 수행되는 문장으로 exit 함수까지 조건문의 내용임을 hint와 조합해서 알 수 있다. 실제로 그 사이에 printf 문에서 어떤 내용을 출력하는지 확인해보면 다음과 같음을 알 수 있다. 만약 if문을 수행하지 않게된다면 exit함수 다음부터 진행한다. ..
level2에 맞는 비밀번호를 입력하고 들어와 우선 현재 상태를 확인한다. 힌트의 내용을 확인해보자. 힌트의 내용을 보면 level1 에서 풀었던 내용을 떠올릴 수 있게된다. 하지만 현재 상태에서 텍스트 파일 편집인 vi를 들어가게 된다면 level2의 권한으로 접속하는 것이기 때문에 level3의 권한을 가진 파일을 검색해보아야 한다. 검색결과 /usr/bin/editor라는 프로그램이 level3의 권한을 지니고 있었고 실행이 가능한 프로그램이라는 것을 인지해 디스어셈블링을 수행하였다. 프로그램의 흐름은 이렇다. 0xbbb(3003)인 권한 level3로 setreuid를 통하여 변경하고 system 함수를 통하여 어떤 명령어를 수행하는 것인데 그 명령어는 vi를 여는 것이다. 즉, level3의 권..