목록Wargame (35)
농소
이어서 다음 문제를 진행해 보겠습니다. 전 단계에서는 RTL을 이용하여 문제를 풀었다면이번에는 RTL을 막아놨네요스택메모리 영역("\xbf")과 라이브러리 영역("\x40") 을 못 쓴다면 이제 남은건 data, text영역이 있네요그러나 data은 사용할 수 없으니 text segment("\x08)를 이용하도록 합시다 c파일에서 확인했듯이 eip를 제외한 buf+ebp영역을 전부 0으로 초기화 되어있습니다.환경변수를 충분히 변조하여 이용 가능하지만 stack메모리 영역도 이용할 수 없고.이런경우 ret 슬레이딩 기법을 이용하면 해결 가능하겠네요 eip(=ret ) 에 main문의 에필로그 ret을 넣어준다면 pop eip, jmp eip가 실행되므로 스택포인터가 증가하게되어결과적으로 eip가 4바이트..
c파일을 보시면 execve의 주소와 execve오프셋을 합하여 execve의 실제 주소를 구하고 있습니다.복잡해 보이지만 그냥 execve라이브러리 함수와 ret과 비교하여 일치여부를 확인하고 있네요execve를 이용하여 RTL공격을 하라는 문제 같습니다.gdb를 열어 확인합니다. execve의 주소를 확인해주고 ret에 넣어서 실행해 봅시다 ldd : /home/giant/assassin: No such file or directory파일을 찾을 수 없다고 하네요현재 권한이 다르기 때문에 실행이 안됩니다 c파일을 편집기를 통해 수정을 해주어야 겠네요 이렇게 현재 id인 bugbear로 고쳐 다시 실행시키겠습니다. 네 이번엔 정상적으로 동작하네요이제 execve의 인자를 넣어야 하는데요원형을 봅시다. ..
C파일을 보면 스택메모리를 사용할 수 없게 만들었고힌트로 RTL을 이용하라고 나와있네요 RTL을 이용합시다. GDB를 펼쳐서 system함수의 주소를 알아내고 system(arg) 함수 arg의 인자값을 /bin/sh를 넣어주기위해 ebp +8 위치에 /bin/sh 주소를 ebp+12에 /bin/sh값을 넣어주었습니다. gdb에서 잘 떨어지는 것을 확인했으니 실제 프로그램에 동일한 코드로 16바이트씩 이동하여 실행하다보면 쉘이 떨어지게 됩니다.
이번에도 문제를 풀어봅시다. c코드를 보면 argv[1]의 인자를 받아 인자값을 strncpy를 통하여 버퍼에 복사를 진행하네요그런데 strncpy함수를 잘 보시면 버퍼크기는 40byte인데 복사를 41byte 까지 할 수 있게 해놨네요즉 1byte를 overflow 하게 만들도록 설계를 해두었습니다.구조를 보면 이 1byte 오버플로우 되는곳이 해당 problem_chile 함수의 ebp값을 오버플로우 할 수 있겠네요 우선 gdb로 들어가서 해당 ebp값을 오버플로우 해보도록 하겠습니다. 네 정상적으로 ebp의 1byte를 overflow하여 해당 버퍼의 중간주소쯤으로 변조시켜줬습니다.그러나 bof원정대를 진행하면서 스택메모리를 이용하여 overflow시킬때 항상 eip의 값을 이용하여변형을 시켜 주었..
이번에도 문제를 풀어보겠습니다. 이번에 추가된 바로는 stack destroyer가 추가되었네요 스택을 전부 못쓰게 막아놨습니다. gdb로 살펴본 결과 스택에 쉘코드를 넣을 공간이 아무리 찾아봐도 없네요후킹기법을 이용 해야겠네요 우선 hook.c라는 간단하게 원본geteuid함수에 갈것을 7777로 낚아채는 코드를 만들었습니다. gcc를 이용하여 공유라이브러리 형태로 만들어주고 LD_PRELOAD라는 환경변수를 추가하여 직접만든 공유라이브러리 PATH를 값으로 지정해줍니다.이렇게 하면 어떤것이든 실행을 할때 이 해당 공유라이브러리가 먼저 실행이 됩니다.id라는 명령어를 쳐본결과 euid가 7777로 반환됨을 확인이 되었습니다후킹이 제대로 먹히네요여기서 물론 편하게 다음 레벨의 euid에 접근하여 my-p..
이번에도 비슷해 보이지만 눈에띄는게 마지막에 보이네요음.. 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인 것을 확인 했습니다. 다시 원래 파일을 심볼릭 링크 하여 해당 주소로 변경후 실행한 결과 쉘이 실행되..