orge의 소스를 확인하도록 하겠습니다.

darkelf의 소스코드에 비하여 한부분이 추가되었습니다.



argv[0]의 크기가 77인지 확인하는 코드가 추가 되었습니다.

 

argv[0]은 프로그램을 실행할때 첫번째 인자를 의미 합니다.

$./orge라고 프로그램을 실행하게 되면

argv[0]에는 /home/darkelf/./orge가 들어가게 됩니다.

, 프로그램의 이름이 /home/darkelf를 포함하여 77byte가 되어야 합니다.

그런데 권한이 없기 때문에 우리가 직접 이 프로그램의 이름을 변경할 수는 없습니다.

따라서 심볼릭 링크를 이용하여 다른 파일을 실행해서 orge를 실행해 주면 argv[0]를 마음대로 바꿀수 있습니다.

(심볼릭 링크에 대한 정보는 구글을 이용해 주세요)

 

ln –s orge link명령어를 통해 orge의 링크파일을 생성해 주고, ./link를 실행하면

argv[0]에는 /home/darkelf/./link가 들어가게 됩니다.

 

이방법을 이용하여 이름이 긴 파일을 생성해 주면 됩니다.

총 필요한 argv[0]77byte 이므로 /home/darkelf/14byte를 제외하고 파일의 이름을 63byte로 생성해 주면 됩니다.

 

그리고 페이로드는 이전 문제를 풀던것과 동일하게 argv[2]NOP슬라이드와 쉘코드를 넣는 방식을 이용하면 될듯 합니다.

 

그럼 우선 테스트를 위하여 tmp폴더에 orge를 옮기고 링크파일을 생성하도록 하겠습니다.

링크파일은 경로가 /home/darkelf에 이어 /tmp 4byte가 추가되었기 때문에 파일의 이름은 59byte가 될듯 하네요.

테스트를 해봤더니 정상적으로 조건을 통과하네요.

Argv[0]./가 들어가는 것을 없애기 위하여 절대 경로로 실행하였습니다.

상대경로로 명령어를 실행하실 분은 이름의 길이를 계산할때 ./ 2byte를 고려해주셔야 합니다.

 

예상 페이로드는 다음과 같습니다.


이제 ebp값을 알아내기 위하여 gdb로 디버깅을 하겠습니다.

알아낸 ebp의 위치는 0xbffffa38입니다. 입력 값에 따라서 프로그램이 들어가는 메모리의 위치가 변경될 수 있기 때문에 실행시 입력 페이로드도 동일하게 넣어 주어야 합니다.

 

보다 정확하게 페이로드의 위치를 구하기 위하여 x/40x $ebp 명령어를 통하여 ebp부터의 메모리 내용을 확인하도록 하겠습니다.

확인 결과 ret의 주소를 0xbffffc08쯤으로 하면 될듯 합니다.

 

수정된 페이로드를 넣어 실행하도록 하겠습니다.

역시나 한번에 안되고 에러가 뜨네요.

 

core dump를 이용하여 gdb 디버깅을 통해 쉘코드의 위치를 확인하도록 하겠습니다.

0xbfffffb8 이후로는 쉘코드가 들어갈 공간이 충분하지 않습니다.

 

따라서 다시 ebp부터의 값을 확인해 보도록하겠습니다.

0x90들이 들어 있는부분의 한 지점을 잡아주면 됩니다.

 

페이로드의 Ret0xbffffba0으로 수정하여 다시 실행해 보도록 하겠습니다.

정상적으로 쉘이 획득이 되었네요.

 

복사파일에서 쉘이 획득 되었으므로 이제 원본 파일을 대상으로 진행하면 될듯 합니다.


우선 길이가 63byte인 심볼릭 링크를 생성하고 페이로드를 입력해 보도록 하겠습니다.


성공적으로 orge의 쉘이 획득 되었네요.

orge의 패스워드는 timewalker입니다.

+ Recent posts