본문 바로가기

보안/시스템 보안

버퍼오버플로우 실습 3

버퍼오버플로우 실습 1 과 비슷한 소스 내용이나

차이점은 서버함수가 추가가 된다

이전에 버퍼오버플로우 실습1 에서 못봤던 스택 같은 상태 정보 등을 볼수 있을것이다.

 

버퍼 오버 플로우 2 보안 환경 설정에서 했던 것처럼 컴파일을 한다.

 

예상했던것 처럼 버퍼 오버플로우가 가능하다

이제 디버깅을 통해 상세히 알아보자

gdb로 해당 프로그램을 실행시키고  list 명령어로 내가 원하는 프로그램으로 됬는지 확인해보자

 

copier() 부분인 11번째 줄 break 와 strcpy() 부분인 6번쨰에도 break를 시키고 실행을 해보자

break 가 잘 걸린걸 확인했고

 

레지스터를 한번 봐보자

 

esp:bffff6e0   ebp:bffff6e8  을 확인한다

왜냐면 함수(copier)를 call를 하면 ebp에 정보를 stack에 저장을 한다.

(esp는 스택의 시작 부분이다)

위 사진처럼 지금은 break가 걸려있는 상태니깐 아직은 없지만 곧 ebp에 data가 esp에 저장되는것을 볼수 있다

step을 통해 break 다음부분을 가고 레지스터로 내용을 확인해보자 .

esp, ebp 내용이 변한것을 확인할수 있고  stack 에 대한 정보를 열어보면 전에 ebp 주소인 bffff6e8이 들어간 것을 확인할수 있다

(변한 ebp값과 이전 esp값이 똑같지가 않는것을 확인을 할수 있는데 메모리를 잡아준 만큼 증가를 하게 되어있지만 파라미터의 갯수,내부 로컬 변수 갯수 등이 추가로 더해져서 변한 ebp값이 나왔기 때문에 다르다 )

참고로 그러면 저 스택에 bffff6e8 옆에 080491ea는 무엇일까?

리턴 어드레스 이다 .

 

레지스터에 eip  명령어에 대한 instruction을 보면 08로 시작하는것을 볼수 있는데

스택에 08로 시작하는 것은 명령어 쪽에 대한 리턴 주소들이고

          bf로 시작하는 것은 스택에 관한 주소들인것을 알수 있다.

 

bufffer를 확인해 보면 아직 아무것도 없은 것을 확인할수 있다

next 하고 스택을 다시 열어보자

이전과 비교해서 보면  A로 도배가 되어서 확실히 달라진것을 확인할수 있다.

 

여기서 next를 누르면 어떻게 될까 ebp를 원래 자리 있던곳을 복원을 하지만 리턴 어드레스는 그대로인 바람에 41414141로 리턴을 하려다 보니 에러가 발생하는것이다

컴퓨터: 롸? 거 41414141 인곳으로 가봤는데 거 아무것도 없는뎁숑?

continue를 하니까 이제 segmentation fault를 확인할수 있다.

 

즉 버퍼 오버플로우가 성립!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형