목록Write up/LOB (19)
ipwn
이번 단계는 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를 이..
LOB를 한 번 공략해보겠다. LOB는 aslr이 걸려있지 않으며 NX가 걸려있지 않다. 그리고 dummy값도 없다. 즉 return address를 shellcode address로 옮겨서 shellcode를 실행할 수 있다는 말이다. 또, 기본 쉘인 bash가 \x90(nop)를 \x00(NULL)으로 착각하는 오류를 발생시켜서 bash2를 실행시켜주고 진행을 하는게 편하다. 서버 구축은 일단 생략하고 시작하도록 하겠다. 첫 단계는 gate단계이다. 그리고 password는 gate이다. 접속을 하고 파일들을 살펴보니 gremlin.c와 gremlin 파일이 있다. 한 번 소스코드를 보겠다. 일단 argv[1]에 값을 받아서 buffer에 복사를 해준다. 그런데, strcpy함수는 길이 제한없이 다 ..