bof 원정대 orge를 잡아보자!

소스코드를 분석한다.


(orge.c)



orge의 소스코드를 보면 특이한 점이 있다. 바로 argv[0]의 길이가 77이여야한다는 점이다.
argv[0]는 프로그램경로 명(프로그램이름포함) 이다.
그러므로 이 문제는 링크를 이용해서 프로그램이름 길이를 조절해야한다.

77바이트니 그 안에 쉘코드를 올리고 argv[0]주소를 넘겨주어도 이 문제를 해결할 수 있을 것이다!

먼저 프로그램 경로명의 길이 77바이트를 맞추기 위한 작업이다.
gdb를 통한 메모리 확인을 위한 것이므로 간단히 cp를 이용해 77바이트만 맞추겠다.



(경로명 77바이트)



이 경로까지 경로 길이는 총 14바이트이므로 나머지 63바이트를 채워주면 된다.

이렇게 만들어진 문제프로그램을 gdb로 열어보자.



(gdb로 실행)



(메모리 확인(인자영역))



인자 영역이 초기화 되지 않는 것을 확인 할 수 있다. 44로 채워진 공간이 프로그램 이름이다.
이 주소를 ret주소로 넘겨주고 이 영역을 NOP + 쉘코드로 만들것이다.

먼저 링크를 생성하기 위해 해야할 일이 있다.
일단한번 만들어보겠다.



(에러발생)


에러가 발생하였다.
이유는 쉘코드 안에 \x2f 가 들어있는데 이것이 아스키문자로 /  를 의미한다. 그렇기에 경로로 인식이 되어서 해당 디렉토리가 없다는 뜻이다. 그러므로 \x2f 가 들어있는 곳을 감안해서 디렉토리를 만들어준다.



(디렉토리 생성)



디렉토리를 생성할 때 -p 옵션을 주어 하위 디렉토리도 한번에 생성한다.


(링크 연결)


그 후 링크를 연결한다.
대상은 Nop(31바이트) + 쉘코드(32바이트) 이다.

자 이제 준비는 끝났다. ret 주소로 아까 확인한 0xbffffbac 로 주고 프로그램을 실행한다!



(Segmentation Fault)



??..?!

뭐지

원인을 파악하기 위해 orge를 ormy로 복사한 후 ormy를 아까 했던 대로 링크를 걸어서 gdb로 열어본다.


(링크 재생성(복사본으로))



그 후 gdb로 메모리를 확인해본다.



(메모리 확인(인자영역))



어라? 이 주소가 맞는데

프로그램을 실행시킨 후 core 파일을 확인해본다.


(core 파일)



core 파일을 확인해보니 원인을 알았다.
이유는 잘 모르겠지만 gdb를 통한 메모리 주소와 조금 다르다...
nop 위치의 아무 주소를 하나 택한 후 그 주소를 넣어준다.

다시 원본 파일에 링크 생성하여 공격 준비



(원본 파일에 링크)


그 후 아까 확인했던 nop영역의 주소 하나를 골라 입력해준다.



(공격 성공)



쉘을 획득하였다 :)


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

(25/500) Lord of the BOF - vampire  (0) 2017.06.20
(24/500) Lord of the BOF - troll  (0) 2017.06.20
(22/500) Lord of the BOF - darkelf  (0) 2017.06.20
(21/500) Lord of the BOF - wolfman  (0) 2017.06.20
(20/500) Lord of the BOF - orc  (0) 2017.06.20

+ Recent posts