-
LEVEL 08 troll write-upSystem hacking training/Hackerschool LOB 2018. 3. 31. 20:28
orge -> troll
[문제]
troll.c 파일을 살펴보면 많은 조건들이 걸려있다.
그 조건들은 아래와 같다.
1. argc 는 무조건 2여야한다. 이 말은 즉 바이너리 이름 + 인자 1개가 아닐경우 종료시킨다는 것이다.
2. egg hunter로 환경변수에 쉘코드를 올려도 0으로 초기화되므로 환경변수를 사용하는 것은 의미가 없다.
3. argv[1] 첫번째 인자값 마지막에 \xbf 인지 검사한다.
4. argument의 길이를 체크해서 48보다 크면 종료시킨다.
5. strcpy() 의 사용으로 bof 취약점이 존재한다.
6. one more 부분에서 argv[1]의 값을 0으로 초기화 해주면서 argv[1]에 쉘코드를 올리더라도 사용할 수 없다.
결론 : buffer hunter로 인해서 buffer에 쉘코드를 올려도 사용할 수 없고 argv[1]에 쉘코드를 올릴 수도 없다.
그렇다고해서 인자를 더 넣는다면 argc 가 3 이상이 되서 종료될것이다.
이전 문제에서 링크 파일을 이용하여 argv[0]의 길이를 우회한 기억이 있다.
따라서 쉘코드를 올려서 사용하기에 가장 적절한 곳은 argv[0] 판단된다.
그렇다면 링크를 걸때 target file에 쉘코드를 넣고 return address를 argv[0]의 주소로 덮어주면 exploit을 할 수 있을 것이다.
여기서 문제가 있는데
내가 사용하는 쉘코드는
\x31\xc0\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80
이런 25byte의 쉘코드를 사용하지만
argv[0]에 쉘코드를 넣으면 쉘코드의 0x2f ('/')가 경로로 인식이 되어 작동하지 않는다는 것이다.
따라서 쉘코드에 0x2f가 없는 쉘코드를 사용해야하는데
일단은 구글링해서 가져왔다.
35byte의 0x2f가 없는 쉘코드이다.
\x31\xc0\x50\xbe\x2e\x2e\x72\x67\x81\xc6\x01\x01\x01\x01\x56\xbf\x2e\x62\x69\x6e\x47\x57\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80
이제
이 쉘코드를 ln 으로 링크 파일로 만들어주고 return address를 argv[0]의 주소로 덮어주면 된다.
먼저 tmp 디렉토리로 가서 심볼릭 링크 파일을 만들어준다.
그리고 argv[0]의 주소를 구하기 위해 core 파일을 생성한다.
이제 argv[0] 의 주소를 구하고..
실제 바이너리가 위치한 곳으로 이동하여 익스플로잇하면 된다.
nop sled가 들어간곳 중 적당한 위치를 ret에 덮어주면 쉘을 딸 수 있다.
이상 풀이를 마친다.
반응형'System hacking training > Hackerschool LOB' 카테고리의 다른 글
LEVEL 10 skeleton write-up (0) 2018.04.11 LEVEL 09 vampire write-up (2) 2018.04.04 LEVEL 07 orge write-up (0) 2018.03.31 LEVEL 06 darkelf write-up (0) 2018.03.21 LEVEL 05 wolfman write-up (0) 2018.03.16