전체 글

tech blog
· 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디렉토리에서 디버..
· Pwnable/FTZ
ID : level13 PW : have no clue 1. hint를 뜯어보자. level11와 상당히 유사하지만, long i가 추가된 걸 확인할 수 있다. main(int argc, char *argv[]) // 인자를 받음 long → 정수형변수, 4바이트 해석해보자면, i를 4바이트로, buf를 1024바이트로 선언했다. 렙14권한이 걸리고, 인자(인자가 argv임)가 전달되면 buf에 argv[1]을 복사하여 넣는다. 만약 i가 0x1234567이 아니라면 프로세스는 죽는다. (kill은 잘 모르겠음 추후 수정) strcpy함수가 쓰이고 버퍼의 크기에 대해 아무 언급이 없는걸 보면 버퍼오버플로우 문제라는 걸 알 수 있겠지? 바로 attackme를 tmp디렉토리로 복사하여 디버깅 해보자! (+그..
· Pwnable/FTZ
ID : level12 PW : it is like this 1. 상당히 level 11과 유사하다. 그냥 strcpy가 gets으로 바뀌었다 ㅎㅎ 디버깅 해서 보면 str, dummy 크기까지 걍 똑같다. 나이쓰 똑같이 환경변수를 이용해 풀어주었다. 환경변수에 쉘코드 저장하고, ret에 환경변수 주소 넣어주고~ 렙11과 다른 점은 인자를 넣는 방식인데, 페이로드 (python -c 'print "\x90"268 + "\x1e\xfb\xff\xbf"';cat)|./attackme 이렇게 작성하면 된다 ㅎㅎ 렙 13으로 ~ 참고: https://grayfieldbox.tistory.com/entry/FTZFree-Training-Zone-Level-12 (2020.02에 작성한 글을 가져왔습니다.)
lvolzoo
sing