passcode : timewalker
(NO DRAG, NO PASSCODE)
bash2. 바로 소스코드를 살펴보자.
이번에는 argc 까지 제한되어 있다. buffer에 직접 shellcode를 박을 수도 없다. 또한 ret 주소에 shellcode를 export하여 주소를 넣고 싶어도 환경변수를 사용하지 못할 뿐더러 argv[1]이 0으로 초기화 되기 때문에 이는 적절한 방법이 아니다. 따라서 argv[1]는 건드릴 수 없다. 결국 우리는 argv[0]에 shellcode를 넣는 수밖에 없다. argv[0]에는 길이 제한이 없기 때문에 이 shellcode를 여기에 넣으면 될 것 같다.
우선 shellcode를 이용해야 한다. 하지만 지금까지 사용한 shellcode는 /bin/bash 를 기계어로 바꾼 것이므로 argv[0]에 넣으면 경로로 인식하여 실행중에 오류를 발생시킬 것이다. 따라서 ‘/‘ 가 없는 shellcode를 새로 짜야한다. 우선 well-known-shellcode를 사용하겠다.
우선 troll 프로그램을 tmp 디렉토리에 옮겨주고 이 안에서 심볼릭 링크를 걸어준다. 심볼릭 링크의 이름은 우리가 마지막에 argv[0]으로 넣어줄 길이와 동일하게 만들어주어야 한다.
우선 심볼릭 링크를 걸어준 프로그램을 gdb를 이용하여 run 한다음 argv[0]의 주소를 찾아내자.
argv[0]의 주소는 0xbffffc12 인 것을 알 수 있다. 이를 이용하여 우선 tmp 내에서 payload를 짜 쉘을 따보자.(core dump를 이용하여 더욱 정확한 주소를 찾을 수 있기 때문)
역시 core dump가 일어났다. core 파일을 분석하여 다시 argv[0]의 주소를 얻었다. -> 0xbffffb7e
이제 다시 orge 디렉토리로 돌아가서 문제를 해결해보자.
이제 payload를 짜야한다. 그 전에 심볼릭 링크 이름이 곧 argv[0]이 되므로 NOP Sled + shellcode(without ‘\x2f’)를 넣어 troll 프로그램을 원본으로 심볼릭 링크를 걸어준다.
이제 심볼릭 링크의 이름에 NOP Sled + shellcode(without ‘\x2f’)를 넣어 만들어준다. 그리고 argv[1] 48bytes는 전부 ‘\xbf’로 채워주자. 또다시 payload를 짜서 쉘을 따자. 또한 ret 주소 자리를 아까 구한 argv[0]의 주소로 채워주자.
성공적으로 쉘이 떴다.
[troll] : aspirin
파일 이름을 어떻게 해서 심볼릭 링크를 걸었는지 도저히 알 수가 없어서 어떻게 없애지 하고 삽질하다가 find 명령어를 통하여 -type l(링크의 형태 파일 검색) 과 -exec rm 를 통하여 삭제하였다. 파일의 이름이 깨져도 파일의 형태나 파일의 종류를 통하여 그 파일을 찾음과 동시에 삭제할 수 있다.
'Pwnable > LOB' 카테고리의 다른 글
[LOB] 9. VAMPIRE (0) | 2020.08.28 |
---|---|
[LOB] 8. TROLL (0) | 2020.08.28 |
[LOB] 6. DARKELF (0) | 2020.08.28 |
[LOB] 5. WOLFMAN (0) | 2020.08.28 |
[LOB] 4. ORC (0) | 2020.08.28 |