Pwnable

· Pwnable/FTZ
명령어 정리 awk cut grep more ls -al | grep bash → 현재 디렉토리에서 bash 글자가 들어간 파일만 출력해라 ls -alp aaa → 이름이 aaa인것의 정보를 보여줘라 find 명령을 통한 소유자, 백도어, 파일 찾기 find /dev -type f → /dev/MAKEDEV 만 떠야함 (백도어 찾기) find / -ctime -1 → 하루동안 만들어진 파일 (해킹 당한 듯 싶으면 확인) find / -perm -4000 → setuid 걸린 파일을 찾는 명령어 find / -nouser → 파일에 소유자가 없는 경우의 파일 권한 관리 명령어 chmod : 파일, 디렉토리의 권한(퍼미션, 허가권)을 변경하는 역할 개별적으로 파일 권한 변경하기 u 사용자, g 그룹, o 다..
· Pwnable/FTZ
ID : level20 PW : we are just regular guys 1. 드디어 마지막이다! level20으로 로그인 하고, hint 파일을 읽어보자. 코드를 해석해보자. #include main(int argc,char **argv) //프로그램 실행과 동시에 사용자 입력을 받음 { char bleh[80]; //문자형 bleh변수에 80바이트 만큼의 크기 할당 setreuid(3101,3101); //clear 계정의 프로세스 ID fgets(bleh,79,stdin); //fgets함수로 bleh변수에 79바이트 만큼의 사용자 입력을 받음 printf(bleh); //bleh변수에 저장된 값 출력 } 해석을 참조하면, fgets 함수로 문자열을 입력받고 bleh[80]버퍼에 79만큼 입력 ..
· Pwnable/FTZ
ID : level19 PW : swimming in pink 1. level19로 로그인 하고, hint파일을 읽어주자. 간단한 코드이다. buf배열을 gets으로 입력받을 때 길이에 대한 제약이 존재하지 않아서 취약점이 발생할 것이다. 이 코드에는 level20의 권한에 관한 코드가 없기 때문에 setreuid를 따로 넣어서 풀어줘야 한다. 구글링 결과, setreuid가 포함된 41Byte Shell Code가 존재한다. "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b..
· Pwnable/FTZ
ID : level18 PW : why did you do it 1. level18에 로그인 한 뒤, hint 파일을 열었다. 그 동안과 다르게 복잡해보이는 코드가 있다. 대충 해석해보니, check변수가 0xdeadbeef가 되면 shellout함수가 실행돼 쉘을 딸 수 있을 것 같은데... 그런데 그동안 해왔던 것처럼 string을 넘치게 하여 check에 죽은 고기를 넣는 방법은, 이번에는 string버퍼가 맨 위에 존재하기 때문에 안 될 것 같다. 이 코드에서 키포인트는 0x08 입력이 들어오면 버퍼의 문자수를 조절해주는 count 변수가 1감소하게 된다는 점이다. 그렇다면 배열의 인덱스가 -가 되도록 하면 앞의 메모리에 접근이 가능하게 될 것이다. 즉, string[100]보다 나중에 존재하는 ..
· Pwnable/FTZ
ID : level17 PW : king poetic 1. level17로 로그인 하고, hint 파일을 읽어보자. 16번 문제와 소스코드가 비슷하지만, shell을 실행시키는 함수 부분이 제외되었다. 그렇다면 환경변수에 쉘코드를 등록하고 쉘코드 주소를 이용해 문제를 해결해보자. (level18의 권한은 실행해주는데 /bin/bash 명령어가 없어서 쉘이 실행이 안 됨. 그래서 쉘코드 넣은 환경변수 주소를 *call에 넣어주는 거) 디버깅. 스택 구조가 buf(20) + dummy(20) + *call ~~~ 임을 알 수 있다. 환경변수에 쉘코드 넣어주고 그 환경변수를 출력하는 코드를 만들어서 실행하자. 페이로드. (python -c 'print "\x90"40 + "\x1e\xfb\xff\xbf"';c..
· Pwnable/FTZ
ID : level16 PW : about to cause mass 1. 새로운 파일인 attackme.c가 있다. 읽기 권한이 없어서 읽을 수가 없다. 그냥 attackme의 소스코드인 것 같으므로 hint파일을 읽어주자. main함수 부분만 분석해 보도록 하겠다. main(){ int crap; void(*call)()=printit; //call 포인터 함수에 printit 함수를 저장 (call 선언, printit로 초기화) chat buf[20]; fgets(buf,48,stdin); //48바이트 만큼의 입력을 buf변수에 받음 call(); //call 함수 호출 = printit 함수 호출 } 지금까지와는 새로운 유형의 오버플로우 문제인 것 같다. 문제 해결은 다음과 같다. buf[20]..
· Pwnable/FTZ
ID : level15 PW : guess what 1. level15로 로그인 해준 후 hint파일을 읽어주자. 14번 문제와 동일한 코드에서 check변수를 포인터로 변경했다. 포인터 변수는 메모리의 주소 값을 저장하는 변수이다. 따라서 check에 들어가는 값은 메모리의 주소 값으로 저장되며, check 포인터변수에 있는 값이 가리키는 메모리 주소에 0xdeadbeef를 넣어줘야 쉘을 딸 수 있을 것이다. (포인터변수는 메모리의 주소값을 저장하니까, 0xdeadbeef값이 들어있는 주소값을 check포인터변수에 넣어줘야 한다는 뜻) fgets(buf,45,stdin); //45바이트만큼의 입력을 buf변수에 받음 그럼 우리가 해야할 일은? buf[20]에서 부터 *check까지의 거리 구하기 디버깅..
· Pwnable/FTZ
ID : level14 PW : what that nigga want? 1. 어김없이 hint를 읽어줍시다. 이번에는 check의 값이 0xdeadbeef면 쉘을 띄우네요. 리턴값을 덮을 필요 없이 check의 값만 덮어 씌워주면 될 것 같습니다! 그런데 buf에 입력을 45바이트로 제한하네요. fgets(buf, 45, stdin); buf : 문자열이 저장될 포인터 45 : 입력받을 문자열 길이 stdin : 입력받을 스트림 지정 fgets은 이렇게 이해하면 됩니다. attackme를 디버깅하기 위해 디버깅 권한이 있는 tmp디렉토리로 복사하여 디버깅 해줍시다. 근데 tmp디렉토리로 복사하는 건 버퍼의 시작위치를 알기 위해서니까 환경변수로 하거나 지금처럼 값만 덮을때는 그냥 level디렉토리에서 디버..
lvolzoo
'Pwnable' 카테고리의 글 목록