기본 콘텐츠로 건너뛰기

Bandit4

Bandit4 Bandit Level 4 inhere 디렉터리 안에 파일들의 내용을 확인해보면 -file07 만이 내용을 제대로 출력하고 있다. 해당 파일이 이번 level의 해답이다. bandit4@bandit:~/inhere$ ls -al total 48 -rw-r----- 1 bandit5 bandit4 33 Nov 13 15:58 -file00 -rw-r----- 1 bandit5 bandit4 33 Nov 13 15:58 -file01 -rw-r----- 1 bandit5 bandit4 33 Nov 13 15:58 -file02 -rw-r----- 1 bandit5 bandit4 33 Nov 13 15:58 -file03 -rw-r----- 1 bandit5 bandit4 33 Nov 13 15:58 -file04 -rw-r----- 1 bandit5 bandit4 33 Nov 13 15:58 -file05 -rw-r----- 1 bandit5 bandit4 33 Nov 13 15:58 -file06 -rw-r----- 1 bandit5 bandit4 33 Nov 13 15:58 -file07 -rw-r----- 1 bandit5 bandit4 33 Nov 13 15:58 -file08 -rw-r----- 1 bandit5 bandit4 33 Nov 13 15:58 -file09 drwxr-xr-x 2 root root 4096 Nov 13 15:58 . drwxr-xr-x 3 root root 4096 Nov 13 15:58 .. bandit4@bandit:~/inhere$ cat ./ "-file07" koReBOKuIDDepwhWk7jZC0RTdopnAYKh

Bandit3

Bandit3 Bandit Level 3 inhere 폴더 안에 숨김 파일이 존재한다. ls 명령어를 -a 옵션 없이 사용하면 숨김 파일을 출력하지 않는다. 흔히 디렉터리 목록 출력을 위해 사용하는 ls -al 을 사용하여 숨김 파일 확인 후 cat 으로 파일 내용을 확인하자. bandit3@bandit:~$ ls -al total 24 drwxr-xr-x 3 root root 4096 Nov 13 15:58 . drwxr-xr-x 29 root root 4096 Nov 13 15:57 .. -rw-r--r-- 1 root root 220 Sep 1 2015 .bash_logout -rw-r--r-- 1 root root 3771 Sep 1 2015 .bashrc -rw-r--r-- 1 root root 655 Jun 24 2016 .profile drwxr-xr-x 2 root root 4096 Nov 13 15:58 inhere bandit3@bandit:~$ cd inhere/ bandit3@bandit:~/inhere$ ls -al total 12 drwxr-xr-x 2 root root 4096 Nov 13 15:58 . drwxr-xr-x 3 root root 4096 Nov 13 15:58 .. -rw-r----- 1 bandit4 bandit3 33 Nov 13 15:58 .hidden bandit3@bandit:~/inhere$ cat ./.hidden pIwrPrtPN36QITSp3EQaw936yaFoFgAB

Bandit2

Bandit2 Bandit Level 2 파일 명에 공백이 삽입되어 있을 경우 전체 파일 명을 싱글 쿼터 혹은 더블 쿼터로 묶어주거나 공백 앞에 역슬러시를 입력하여 처리한다. bandit2@bandit:~$ ls -al total 24 drwxr-xr-x 2 root root 4096 Nov 13 15:58 . drwxr-xr-x 29 root root 4096 Nov 13 15:57 .. -rw-r--r-- 1 root root 220 Sep 1 2015 .bash_logout -rw-r--r-- 1 root root 3771 Sep 1 2015 .bashrc -rw-r--r-- 1 root root 655 Jun 24 2016 .profile -rw-r----- 1 bandit3 bandit2 33 Nov 13 15:58 spaces in this filename bandit2@bandit:~$ cat 'spaces in this filename' UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK bandit2@bandit:~$ cat "spaces in this filename" UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK bandit2@bandit:~$ cat ./spaces\ in\ this\ filename UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK

Bandit1

Bandit1 Bandit Level 1 level 0와 유사하게 파일 명이 - 라서 경로 없이 파일 명만 사용하면 내용이 출력되지 않으므로 절대 경로 혹은 상대 경로를 명시하여 cat 명령어로 읽으면 내용을 확인할 수 있다. bandit1@bandit:~$ ls -al total 24 -rw-r----- 1 bandit2 bandit1 33 Nov 13 15:58 - drwxr-xr-x 2 root root 4096 Nov 13 15:58 . drwxr-xr-x 29 root root 4096 Nov 13 15:57 .. -rw-r--r-- 1 root root 220 Sep 1 2015 .bash_logout -rw-r--r-- 1 root root 3771 Sep 1 2015 .bashrc -rw-r--r-- 1 root root 655 Jun 24 2016 .profile bandit1@bandit:~$ cat ./- CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9

Bandit0

Bandit0 Bandit Level 0 OverTheWire - bandit 페이지에서 Level 0을 선택하여 제공된 SSH 서버에 접속하면 readme 파일을 확인할 수 있다. 간단히 출력하여 내용을 확인해보면 bandit1의 접속 패스워드 정보를 확인할 수 있다. bandit0@bandit:~$ ls readme bandit0@bandit:~$ cat readme boJ9jbbUNNfktd78OOpsqOltutMc3MY1

memory-corruption-impact

memory-corruption-impact 메모리 오염 영향 평가 취약점의 심각도를 가장 정확하게 파악할 수 있는 방법은 POC 공격을 작성하는 것이지만, 이는 너무 많은 시간을 필요로 한다. 따라서 몇 가지 질문에 대한 답을 찾는 것으로 영향 평가를 수행할 수 있다. 메모리에서 버퍼의 위치 변수는 주로 스택, 힙, 지속 데이터(정적 변수, 전역 변수 포함) 이렇게 세 개의 메모리 영역에 저장되지만 종종 이 세 위치를 분할하거나 새로운 영역을 나누기도 한다. 때로는 초기화된 전역 변수와 초기화 되지 않은 전역 변수를 나누기도 하고, 특별할 위치에 TLS를 두기도 한다. 또한 공유 라이브러리는 라이브러리 코드 바로 다음에 위치하는 프로세스 메모리에 초기화되거나 비초기화된 상태에서 매핑된다. 어디서 메모리 오염이 일어나고 어떤 특별한 고려 사항이 적용되는지 파악할 필요성이 있으며, 운영체제 별 고유 메모리 배치에 대한 이해가 필요하다. 다른 데이터로 덮어쓰기 되는 것 메모리 오염은 공격자가 목표하는 변수에만 국한되지 않을 수 있으며, 다른 변수에 까지 값을 덮어 쓸 수 있다. 예제에서 보는 바와 같이 프로그램 카운터를 덮어쓰기전 지역 변수 값을 같이 덮어쓸 수 잇다. 지역 변수로의 오버플로우 int dostuff ( char * login ) { char * ptr = ( char * ) malloc ( 1024 ) ; char buf [ 1024 ] ; . . . strcpy ( buf , login ) ; . . . free ( ptr ) ; return 0 ; } 여기서 공격자는 프로그램 카운터를 덮어쓸 때 ptr 변수도 같이 덮어쓰게 되는데, ptr 변수는 프로그램이 리턴되기 바로 전에 해제되는 값이다. 이로 인해 유효하지 않은 주소 값으로 ptr 변수를 덮어 쓰게 되면 free() 함수 호출 시 프로그램 크래시가 발생할 수 있다. 이로

switch-case-default-2

switch-case-default-2 조건이 많은 switch 문 source # include <stdio.h> void f ( int a ) { switch ( a ) { case 0 : printf ( "zero\n" ) ; break ; case 1 : printf ( "one\n" ) ; break ; case 2 : printf ( "two\n" ) ; break ; case 3 : printf ( "three\n" ) ; break ; case 4 : printf ( "four\n" ) ; break ; default : printf ( "something unknown\n" ) ; break ; } } int main ( ) { f ( 2 ) ; } x86 MSVC $SG5332 DB 'zero', 0aH, 00H $SG5334 DB 'one', 0aH, 00H $SG5336 DB 'two', 0aH, 00H $SG5338 DB 'three', 0aH, 00H $SG5340 DB 'four', 0aH, 00H $SG5342 DB 'something unknown', 0aH, 00H EXTRN ___acrt_iob_func:PROC EXTRN ___stdio_common_vfprintf:PROC _main PROC push OFFSET $SG5336 call _printf a