목록Wargame/The Lord Of The BOF (20)
농소
이번에도 비슷해 보이지만 눈에띄는게 마지막에 보이네요음.. argv값을 전부 초기화 시켜버립니다. . . 쓸 공간이 있으려나. . .?gdb로 살펴보도록 하겠습니다. 살펴보니 스택 제일 밑자락에 무엇인가 값이 담겨있습니다.무엇인지 보니 0xbfffffe2주소부터 해당 파일의 절대경로를 보여줍니다이것을 이용하면 될 것 같네요 메모리 공간이 작으니 쉘코드 크기를 신경써서 넣어주도록 합시다저는 25byte 쉘코드를 넣겠습니다. 우선 경로를 만들어주고 링크로 쉘코드 파일을 만듭니다. 아까 확인한 주소에 값을 넣으니 쉘이 실행 되었네요
지금까지 문제들을 전부 \xff를 써서이전과는 다르게 argv[1][46]에 /xff를 쓰지말라고 하네요. . . 공간을 한번 만들어 보겠습니다. 이런식으로 매우 많은 코드를 넣어 현재 스택메모리를 확인했더니 스택주소가 bffff~ 가 아닌 bffe로 변경됨을 확인 했습니다.이제 저 nop코드중에 쉘코드를 넣어 실행시키면 될 것 같습니다. nop코드에 쉘을 넣고 실행되었더니 쉘이 실행되어 권한상승이 일어났습니다.
다음 troll파일을 보면 전 문제같은 경우 argv[2]를 이용하여 공격을 했는데 0,1만 사용할 수 있게 해뒀네요또 추가적으로 argv[1]을 0으로 초기화 시키네요 그러면 argv[0]에 쉘코드를 넣어야 겠습니다아마 전의 darkelf에서 했던 방법 그대로 하면 되겠네요 자 우선 2f를 /로 인식을 하기에 신경써서 경로를 만들어줍니다. 만들어 주었으면 심볼릭링크를 이용하여 쉘코드를 넣습니다. 제가 argv[0]주소를 나타내는 코드를 따로만들어 실행한겨로가 bffff8c5가 나왔습니다 실제 공격파일의 eip위치에 저 값을 넣어주면 되겠습니다. 임의로 만들었던 파일을 제거하고 실제 공격파일을 생성하여 실행한결과 쉘이 실행되었습니다.
이번문제는 argv[0]의 길이를 추가로 체크하네요공격을 하려면 심볼릭 링크로 argv[0]에 쉘코드를 넣거나 argv[2]의 값을 이용하거나argv[0]에 쉘코드를 넣을때 길이체크하는것은 여러모로 귀찮을것 같으니 심볼릭 링크로 길이만 맞추어 주고 argv[2]에 쉘코드를 넣도록 하겠습니다. 우선 심볼릭 링크로 길이를 맞춰주고 bbbb... 파일은 제가따로 argv[2]길이를 체크 하기위해 만든 파일입니다.입력해보니 bffff7cc가 시작주소가 되네요 argv[2]의 길이체크는 하지않으므로 넉넉하게 nop코드를 넣어주고 쉘코드를 삽입하여 실행한 결과 쉘이 실행되어 권한상승이 일어나게 됐습니다.
살펴보면arg 0,1 두개 사용 가능환경변수 0 초기화첫번째 인자의 48번째값 = \xbf 스택메모리 이용 첫번째 인자 길이체크버퍼메모리 0 초기화 추가적으로 1번째 인자의 길이를 막았네요arg 0번째는 아직 체크를 안하므로 0번째에 쉘코드를 넣어서 실행시키도록 하겠습니다. 심볼릭 링크를 이용하여 0번째 인자에 쉘코드를 넣으려고 했으나 경로설정이 안되어서 오류가 발생했습니다. \x2f이 / 로 인식하나봅니다. 경로를 만들어 줍시다. 정상적으로 링크가 설정되어 있는것을 확인할 수 있습니다 제가 따로 argv[0]의 시작주소를 출력해주는 것을 추가해주어 확인한 결과 bffff8ad인 것을 확인 했습니다. 다시 원래 파일을 심볼릭 링크 하여 해당 주소로 변경후 실행한 결과 쉘이 실행되..
네 다음 레벨의 문제를 보니 이번엔 추가적으로 buffer hunter라고 버퍼메모리를 못쓰게 막아놨네요그런데 이전에 저는 환경변수 메모리를 이용했으므로 그대로 이용해 줍시다. 이전문제랑 똑같은 명령어를 넣으면 쉽게풀립니다. * 시작주소는 달라질 수 있습니다.
이번에는 egghunter라는 방어책을 하나 추가시켰네요 그리고 첫번째 인자의 47번째 문자('\xbf')가 아니면 강제로 종료가 되네요그런데 버퍼의 크기가 buffer(=40byte), ebp(=4byte), eip(=4byte)저 47번째 위치는 eip가 들어가는 주소이기 때문에 어차피 bof를 할 때 저 위치에는 '\xbf'가 와야 하므로 딱히 신경 쓸 필요는 없는 것 같습니다. gdb로 확인한 결과 eip의 첫주소엔 bf가 들어갈 수 밖에 없습니다. payload $(python -c 'print "" * 44 + "" + "" ')특정문자에 nop을 쓰면 주소를 찾기 쉬우니 쓰시면 더 편하실겁니다. 쉘코드를 넣어주고 쉘주소를 설정하여 실행한 결과 정상적으로 쉘이 실행 되었습니다.
다음 gobilin 파일의 문제입니다. 이번에는 인자가 아닌 표준입력으로 bof를 해야하는 문제입니다. 크기를 보니 버퍼공간에 쉘코드를 삽입 할 수 없으니환경변수에 쉘코드를 넣도록 하겠습니다. payload (python -c 'print "" * 20 +"" + ""';cat) | ./goblin
이어서 2번 문제 입니다. 이전 문제에서 추가적으로 방어기능을 만들었네요 버퍼크기를 줄여 쉘코드를 버퍼에 삽입할 수 없게 만들었습니다. 보시다 시피 버퍼내부에는 쉘코드를 넣을 공간이 모자랍니다.그래서 저는 버퍼 공간이 아닌 환경변수들이 들어가는 공간에 쉘코드를 삽입하여 공격하겠습니다. payload $(python -c 'print "" * 20 +"" + ""')