bof

ftz

[ftz] level15

문제분석 & 풀이코드 분석1. crap, *check, buf[]를 선언했다.2. fgets()를 이용하여 사용자에게 45바이트를 입력받는다.3. (*check == 0xdeadbeef) 인 경우에 level16의 셸을 얻는다. 이전 문제와 비교하면 1가지가 달라졌다. level14에서는 check 변수가 int 타입 변수였지만, 이번에는 포인터 변수로 선언됐다. 무슨 차이인지 짧게 설명하도록하겠다. [그림]은 level14 때 사용한 attackme의 스택 그림이다. check 변수가 int형이고 check==0xdeadbeef 여야 한다. 따라서 노란색 박스 영역에 0xdeadbeef 값이 들어가야 level14를 클리어 할 수 있었다. 그러나 이번 문제는 check 변수가 포인터 변수이다. 따라서 ..

ftz

[ftz] level14

문제분석 & 풀이코드 분석1. crap, check, buf[] 를 선언2. fgets()를 통해 buf에 45바이트의 입력값을 받는다.3. check 변수 값이 "0xdeadbeef" 이면 level15의 셸을 얻어낼 수 있다. buf의 20바이트를 넘어선 45바이트를 입력 받고 있음으로 버퍼오버플로우가 발생할 수 있다. 다만, check 변수를 통해 셸권한을 얻어낼 수 있음으로 check의 값을 "0xdeadbeef"로 설정하도록 페이로드를 완성해 BOF를 시도하는 것이 문제의 핵심이 될 것이다. 코드를 보면 buf 상단에 check가 위치하는 것을 알 수 있다. 하지만 그 사이에 dummy가 얼마나 있을지 모르기 때문에 GDB로 직접 디버깅해서 확인해야한다. attackme를 tmp 폴더로 복사했다..

ftz

[ftz] level13

문제분석 & 풀이코드 분석1) i, buf[1024]를 선언2) setreuid()를 통해 level14의 권한으로 설정3) argv[1]을 통해 입력받은 값을 buf에 복사4) 만약, i의 값이 바뀔 경우 BOF로 간주하고 프로그램 강제종료 이전 문제와 다른점은 변수 i를 통해 BOF가 발생하는지 안하는지를 체크하고 있다는 점이다. 이것을 우회하기 위해 변수 i가 바뀌지 않는 선에서 페이로드를 만들어서 BOF를 진행해야 할 것 같다. attackme를 tmp 폴더로 복사하여 GDB로 디버깅했다. main 시작 후에 0x418 만큼 스택공간을 할당한다. 0x418 = 1048임으로 [buf 1024바이트] + [더미 24바이트]가 포함됐다는 것을 알 수 있다. 그러나 더미 24바이트안에는 변수 i의 공간..

ftz

[ftz] level12

문제분석 & 풀이○ 코드 분석1. str[256] 선언2. setreuid()를 통해 level13 권한으로 설정4. gets()로 사용자에게 값을 입력받는다.  level11번과 마찬가지로 입력값에 대한 검증을 진행하지 않고 있기 때문에, 버퍼오버플로우 문제라는 것을 직감할 수 있다. 그러나 level11과의 차이점은 level11의 경우 argv[1]을 통해 입력값을 받았지만 이번 문제는 프로그램 시작 후에 입력값을 받고 있다. 따라서 페이로드를 작성할 때 파이프를 사용해야 할 것 같다. 문제로 돌아와서, 페이로드 작성 시를 제외해서는 level11번 문제와 동일하므로 똑같이 진행해보도록 하겠다. 먼저, str[256] 부터 ret 까지의 거리를 알아내기 위해서 attackme를 디버깅해야한다. 따라..

ftz

[ftz] level11

문제분석#include #include int main( int argc, char *argv[] ){ char str[256]; setreuid( 3092, 3092 ); strcpy( str, argv[1] ); printf( str );}○ 코드 분석1) str[256] 선언2) setreuid()를 통해 level12의 권한으로 설정3) argv[1]을 받고 str[256]에 복사4) str[256] 출력 level12 권한으로 설정 후 argv[1]을 str[256]에 복사하고 있다. 복사하는 과정에서 argv[1]에 대한 검증이 없다. 따라서 argv[1]을 이용해서 버퍼 오버플로우 공격을 수행할 수 있다. 디렉토리의 파일들을 확인해보면 attackme라는 level12의 setuid ..

ftz

[ftz] level9

문제분석 & 풀이bof 코드를 알려주고 있다. buffer overflow 취약점을 실습하는 첫번째 문제다. ○ 코드 분석1. buf2[10], buf[10] 배열을 선언한다.2. fgets()를 이용하여 사용자에게 입력을 받아서 40바이트 만큼 buf[]에 저장한다.3. strncmp()를 통해 buf2[]의 앞 두자리가 "go"인지 확인하고 맞으면 level10의 password를 알려준다. 사용자가 입력한 값을 buf에 저장하는데, 우리가 값을 넣고 싶은 배열은 buf가 아닌 buf2다. 그렇다면 어떻게 buf2에 "go"를 넣을 수 있을까? 앞에서 언급했듯이 buffer overflow를 이용하면 된다!. ○ BOF (buffer overflow)메모리에 생성된 버퍼 크기보다 더 많은 양의 입력값..

keyme
'bof' 태그의 글 목록 (3 Page)