코드
코드의 동작은 이전 문제들과 별다른 것이 없다.
하지만 다음의 조건들을 모두 우회해야 한다.
1. egghunter 환경변수를 쓰지 못함
2. argv[1] + 47, 즉 shellcode의시작 주소가 \xbf이어야 함(스택 영역에 shellcode 적재)
3. 버퍼 내 쉘코드 쓰기 불가
4. argv[1]의 길이를 48로 제한
5. argv 모두 초기화
이전 문제들과 달리 5번 조건이 추가되었다. 이전 문제에서 1-4를 우회하기 위해 인자에 shellcode를 쓰는 등의 행위를 했는데, 이를 초기화하는 것을 해결하여 buffer over flow 공격을 수행해야 한다.
공격
취약한점을 찾고 buffer over flow임을 알았고, 우회해야 되는 조건들을 알았으니 공격을 시작한다.
인터넷을 통해 자료를 찾아보니, 스택의 끝에 프로그램 경로가 저장 됨을 알았고, 심볼릭 링크를 통해 쉘코드를 이름으로 하는 파일을 생성하여 그 시작 주소로 RET를 변조하면 된다.
하지만 이와 같이 했을 경우 실행이 되지 않는데, 아마도 첫 번째 인자 값 앞, 뒷 부분이 바뀌거나 짤리는 것으로 예측 된다. 따라서 앞 뒤로 NOP를 넣어 해결한다.
1. argv[1]에 shellcode 적재 -> 스택의 끝에 저장
결과
쉘 획득
참조
여기에서 앞뒤가 짤리는 것은 왜인지는 모르겠지만 경로가 상대경로, 절대경로 등의 풀 경로가 저장되기 때문이다. 따라서 상대경로가 될 경우 /home/vampire/ 인 14만큼을 더한 곳의 주소로 RET 를 변조해야 하고, 절대경로가 될 경우 ./ 인 2만큼을 더한 곳의 주소로 RET를 변조해야 한다.
이를 완벽하게 성공하기 위해 앞에 NOP(\x90) 을 포함하는 쉘코드를 사용할 경우, 항상 성공할 수 있게 된다.
* 다른 워게임이나 CTF 시에도 정확한 버퍼사이즈를 요구하지 않을 경우 NOP 의 사용을 적극 추천한다.
'system' 카테고리의 다른 글
[LOB] vampire (0) | 2016.09.27 |
---|---|
[LOB] troll (0) | 2016.09.27 |
[LOB] orge (0) | 2016.09.27 |
[LOB] darkelf (0) | 2016.09.27 |
[LOB] wolfman (0) | 2016.09.27 |
댓글