목록Write up (43)
ipwn
이번 단계는 skeleton 단계이다. 바로 접속후 파일들을 보겠다. golem 파일과 golem.c 코드가 있다. 바로 코드를 읽어보도록 하겠다. 코드를 살펴보니, stack 영역의 공간이 ret 부분말고 전부 초기화 되는 것을 확인할 수 있다. 그럼 어떻게 해결해야할까? 사실 나도 이 부분은 처음 풀 때 다른 블로그들을 많이 참조했다. 바로 공유 라이브러리(LD_PRELOAD)를 사용해야 한다. 공유 라이브러리란 우리가 지정한 사용자 함수를 라이브러리에 올려 라이브러리 함수처럼 사용하는 것이다. 우리가 사용하는 라이브러리 libc.so와 같은 라이브러리들은 효율적으로 함수를 사용하기 위해 메모리상에 적재된다. 그런데 이러한 라이브러리들이 할당받는 공간은 이 사진과 같이 이뤄져있다. (저 사진의 dat..
이번 단계는 vampire단계이다. copy file을 만들고 바로 파일을 살펴보겠다. 기본적으로 skeleton file과 skeleton.c 코드가 있다. 바로 코드를 읽어보도록 하겠다. 코드가 제한이 많아졌다. 다 비슷한 제약이지만 가장 큰 문제가 생겼다. 바로 argv가 모두 사라졌고 buffer의 앞 공간도 사라졌다. 즉 쓸 공간이 거의 모두 없어졌다... 이럴 경우에는 어떻게 해야할까? 일단 조건에 맞게 값을 넘겨주어 core dump를 한 번 보도록 하겠다. 이렇게 값을 넘겨주었다. 한 번 core dump를 gdb로 debugging 해보겠다. 사용 가능한 공간이 정말 하나도 없어보인다. 하지만 맨 밑 부분 환경변수가 존재할 부분을 보면 ./로 시작하는 문장이 보인다. 한번 string을 ..
이번 단계는 troll 단계이다. 이번엔 바로 copy file을 생성하고 시작해보도록 하겠다. 바로 코드를 보도록 하겠다. 저번보다 코드가 많이 짧아졌다. argv를 몇 개 사용해도 제한이 없어졌고, argv[1]의 길이 제한도 사라졌다. 하지만 argv[1][46] == \xff이면 프로그램을 종료시킨다. 이 말은 즉 return address에서 2번째 bit가 \xff가 아니어야 한다는 말이다. 이건 어떻게 해줘야할까? 일단 예전처럼 뒷 공간에 nop을 200개 넣고 shellcode를 넣는 방식으로 core dump를 한 번 가져와보자. core dump를 이용해 메모리를 읽어보겠다. 바로 메모리를 봤지만 buffer에서 \x90의 위치는 0xbfffXXXX으로이뤄져있다. 즉 두번째 bit가 \..
이번 단계는 orge 단계이다. 이번에도 copy file을 생성하지 않고 접속 후 바로 파일을 살펴보겠다. 기본적으로 troll파일과 troll.c코드가 주어져있다. 바로 코드를 읽어보도록하겠다. 이번에도 저번코드와 완전 비슷하다. 하지만 좀 더 제한을 하는 부분이 많아졌다. argc는 무조건 2의 값을 가져야 한다. 즉 argv[1]까지밖에 사용을 할 수 없다는 말이다. 그런데 argv[1]의 값, buffer의 값을 다 지워버린다. 도대체 어떻게 exploit을 할 수 있다는 말일까? 사실 이 부분에서 조금 고민을 많이 했었다. 남는 부분이 딱 한 공간이 있다. 바로 argv[0] 즉 file의 이름이다. argv[0]의 공간에 nop 여러개와 shellcode를 놓아주고 return address..
이번 단계는 darkelf 단계이다. 바로 접속해보자. 이번에는 조금 다르게 copy file을 만들지 않고 파일들을 살펴보겠다. 기본적으로 주어지는 orge파일과 orge.c 코드가 있다. 바로 코드부터 보자. 좀 더 길어졌다. 저번 코드와 거의 완벽히 유사하다. 아마 똑같이 argv[2]를 넣어서 풀 것이다. 하지만 조금 달라진 점은 argv[0]의 길이를 검사해 만약 77byte크기가 아니라면 프로그램을 종료시킨다는 점이다. 그래서 이번엔 copy file을 먼저 만들지 않고 파일을 확인했다. 어찌 됐던 copy file을 만들어야 core dump를 확인할 수 있을테니 copy file을 만들어보자. 대신 만들 때 file 이름의 길이를 75자로 만들어 줄 것이다. 왜냐하면 argv[0]에는 경로..
이번 단계는 wolfman 단계이다. 바로 copy file을 생성하고 파일을 살펴보겠다. 기본적으로 darkelf파일과 darkelf.c 코드가 있다. 바로 코드를 읽어보도록 하겠다. 점점 코드가 길어지는게 익숙해진다. 각설하고 이번 코드도 저번 코드와 완전 유사하다. 하지만 다른점은 argv[1]을 검사해서 48byte를 초과하면 프로그램을 종료시켜버린다. 즉 argv[1]의 뒷 공간에다가는 shellcode를 올릴 수 없고 buffer의 뒷 공간도 더더욱 그럴 것이다. 그렇다면 어떻게 해야할까? argv[2]의 공간을 사용하면 된다. argc는 2보다 작지만 않으면 상관이 없기에 argv[2],argv[3],argv[4]....을 쭉 써도 상관이 없다. 그렇다면 argv[1]의 공간을 return ..
이번 단계는 orc 단계이다. 바로 접속하고 파일들을 살펴보겠다. 기본적으로 wolfman파일과 wolfman.c코드가 있다. 바로 코드를 읽어보도록 하겠다. 코드를 보면 저번 코드와 완전 유사하다. 하지만 버퍼의 시작부터 40byte는 memset을 통해 0으로 바꿔줘버렸다. 즉 buffer의 첫 부분에다가 shellcode를 박아놓고 return address를 buffer의 첫 주소로 바꿔서 shellcode를 실행하는 것이 불가능하다는 말이다. 하지만 우리는 이번에도 저번에 풀었던 방식인 buffer의 뒷 공간을 이용해서 푼다면 전혀 상관이 없을 것이다. 즉 저번 문제와 payload가 거의 일치하는 수준일 것이다. 일단 copy file을 segmentation fault를 일으켜서 core d..
이번 단계는 goblin 단계이다. 바로 접속해서 copy file을 만들고 bash2를 실행시켜주겠다. 기본적으로 goblin 파일과 goblin.c 코드가 있다. 코드를 살펴보겠다. 코드를 보니 일단 이전과는 다르게 좀 길어진 것 같다. 하지만 걱정할 필요 없다. 크게 달라진 내용이 없기 때문이다. 일단 argc는 2보다 작아서는 안되며, 입력은 argv로 넘겨받고, 환경변수를 사용할 수 없다. 그리고 argv[1][47] 즉 return address의 맨 앞부분이 \xbf로 시작해야 한다. 설명이 어려워보일 수 있지만 이것도 이전과 같이 매우 간단히 exploit할 수 있다. 일단 \xbf조건을 맞추는 것은 크게 신경쓸 필요 없이 성립 될 것이다. 그리고 argv[1]을 사용한다면 argc는 무조..
이번 단계는 cobolt 단계이다. 접속 후 바로 bash2를 실행한 뒤 파일들을 살펴보겠다. 이제 바로바로 복사본을 만들기로 하자ㅋㅋ 기본적으로는 goblin파일과 goblin.c코드가 존재한다. 코드를 바로 읽어보겠다. gremlin단계 때의 코드와 똑같다. 바뀐점은 argv로 공략하는 문제가 아닌, gets함수로 입력을 받아서 해결하는 문제이다. 해결 방식은 이전과 완전 똑같지만 payload를 넘겨주는 형식을 다르게 해주면 되는 문제이다. stdin 형태로 입력을 받을 때는 (python -c 'print "~~~~~"';cat)|./filename의 형태로 payload를 넘겨준다. 일단 똑같이 segmentation fault를 일으켜서 core dump를 확인해보겠다. 똑같이 20byte의 ..
이번 단계는 gremlin 단계이다. 한 번 접속하고 파일들을 살펴보겠다. cobolt파일과 cobolt.c파일이 있다. 일단 bash2를 바로 실행하고 코드를 살펴보겠다. 이번 코드는 gate코드랑 완전 똑같은데 buffer의 크기만 줄어들었다. buffer크기가 현저하게 줄어들어서 buffer의 시작주소에 shellcode를 넣지는 못할 것이다. 그러므로 buffer의 뒷 부분이나 argv[2]를 이용해 shellcode를 넣어주고 return address에 shellcode의 주소를 넣어주면 될 것이다. 일단 그럼 넣어주면 되는 값은 dummy*20 + shellcode address + nop(\x90)*임의의 값 + shellcode이 될 것이다. nop을 넣어주는 이유는 nop sled를 이..