bof 원정대에서 wolfman을 잡아보자!

wolfman 소스코드를 확인!



(wolfman.c)



wolfman의 특징
1. 버퍼 40바이트
2. 인자 1개 이상 넘겨줘야한다.
3. 환경변수 초기화
4. 스택영역을 사용해야한다.
5. 버퍼를 초기화한다.!

사실 난 쉘코드 주소로 버퍼 주소를 사용하지 않았기에 버퍼를 초기화하는 기술이 추가해도 전문제와 큰 차이를 못느꼈다.

하지만 다른 방식으로 풀이해볼 겸하여 Nop 슬레이딩을 이용해보겠다.!

먼저 늘 그렇듯 gdb를 열어 메모리를 확인해본다.



(gdb를 이용하여 실행)



조건에 맞춰 strcpy 버퍼오버플로우가 일어나는 영역까지 진행시키기 위해 인자 하나를 추가하고 ret 주소 영역을 bf로 시작하게 하였다.




(메모리 확인(버퍼초기화))



버퍼가 초기화 된 모습을 볼 수 있다.

하지만 우리가 전문제에서 사용했던 영역은 인자 주소!



(메모리 확인(인자 주소))



이 영역은 살아있다 :) 이영역을 이용해 보겠다.

Nop슬레이딩을 사용할 것이므로 앞에 Nop 코드를 붙여줄것이다. 단 첫번째 인자에는 Nop을 붙일 수 있는 한계가 있으므로 두번째 인자에 Nop코드와 Shell 코드의 주소를 넘겨줄 것이다.

바로 ret 주소를 대강 넘겨주어도 괜찮다는 것이 Nop슬레이딩 기법의 장점이다. 전 문제까지 우리는 정확한 주소를 찾기위해 core dump 도 하였고 하면서 정확한 주소를 찾아내었다. 이번에는 Nop 슬레이딩을 이용하여 터프하게 해볼 것이다.

대강 0xbffffc88 주소로 ret 주소를 넘겨주고 두번째 인자로 Nop코드 100개와 쉘코드를 넘겨준다.



(Nop+쉘코드 공격)



혹시 모르니 gdb를 이용해 대강의 주소를 확인해본다.
내가 넘겨준 주소는 0xbffffc88



(ret 주소)



ret주소에 잘 들어가 있는것을 체크!



(0xbffffc88 주소)



주소를 확인해보니 잘못 짚었다. 대강의 주소 0xbffffc08로 잡아주어 공격해볼것이다.



(gdb로 다시 확인)




(ret주소)



0xbffffc08 주소가 잘 들어간 것을 확인!



(0xbffffc08 주소)



0xbffffc08 주소에 Nop 영역이 있는것 확이!

이렇게 되면 Nop이 실행되면서 쭉쭉 내려가서 아래 우리의 쉘코드까지 실행을 시킬 것이다.

바로 대담하게 우리 복사본이아닌 원본 코드에 바로 공격해본다.




(공격 성공)



바로 쉘이 떨어진다.
Nop슬레이딩의 위력이다! :)

'WarGame > 500 Project' 카테고리의 다른 글

(23/500) Lord of the BOF - orge  (0) 2017.06.20
(22/500) Lord of the BOF - darkelf  (0) 2017.06.20
(20/500) Lord of the BOF - orc  (0) 2017.06.20
(19/500) Lord of the BOF - goblin  (0) 2017.05.07
(18/500) Lord of the BOF - cobolt  (0) 2017.05.05

+ Recent posts