딩굴댕굴

[Hackerschool FTZ] level 11 - Stack Buffer Overflow

by jennysgap

BOX


[Hackerschool FTZ] level 11 - Stack Buffer Overflow


버퍼 오버플로우의 취약점에 대한 공격 기법 이해

포맷 스트링의 개념 이해 및 취약점에 대한 공격 기법

strcpy 를 이용하여 버퍼 오버플로우를 발생시켜 레벨12의 쉘을 시키는 것이 목적임


Password: what!@#$?



setuid가 걸린 파일은 원래 gdb가 걸리지 않음... 하지만 아래 결과를 보면 걸림.


그래도 혹시 모르니 원본파일을 copy하여 살펴보기

※ 분석을 할 때는 무조건 복사해서 살펴보는 것이 좋음!


dummy로 인해 단순히 256만큼 증가되지는 않았을 것이다.

그래서 disas main (디스어셈)을 통해서 볼 필요가 있다.

여기 esp가 stack frame pointer의 위치임 거기에서 108(10진수로 264)만큼 빼달라는 의미가 됨

※ 항상 buffer가 생긴 후 dummy가 생김


264만큼 써야지 str을 덮어쓸 수가 있고 우리가 실제로 조작해야할 값은 RET이다.

왜냐하면 소스코드를 보면 출력하고 나서 동작이 없음 바로 종료하기 때문에 리턴값을 원하는 위치로 점프시키는 것이 목적이다.


쉘코드를 어딘가 메모리에 올려놓고 return 주소값을 쉘코드 있는 곳으로 점프시키면 쉘이 실행되고

setuid에 의해서 레벨12 권한으로 쉘을 실행시킬 수 있게 된다.     EGG Shell.c


위 코드를 설명하면 shellcode[]를 환경변수 EGG에 저장하는 코드이다. 환경변수는 어디에 있는가? env 영역에 있다.

즉, 메모리에 shellocde[]를 쓰고 그리고 그 값을 환경변수(env 영역) EGG에 저장하는 코드이다.


11:46

EGG의 주소값을(=쉘의 주소값을) 알아내는 간단한 코드이다. 

./pegg      pegg.c


eggshell.c 와 pegg.c 컴파일 후 실행


주소 값은 두개씩 나눠서 뒤에서부터 적는다.


이 문제에 대한 핵심

우리가 어딘가 shellcode를 로딩시켜 놓는다면 그 shellcode 쪽으로 RET(리턴주소값)을 변경시켜서 점핑시킬 수 있다.


만약 쉘코드 만드는 방법이 궁금하면 따로 알아봐도 됨

- 칼리리눅스 안에 있는 메타스플로잇은 쉘코드가 다 들어있음

- 인터넷에서 쉘코드가 매우 많음




※ 내용정리

그러나 여기서의 핵심은 버퍼가 생성될 때 str(256+8dummy) 이렇게 생성될 수 있구나

이것을 확인하는 방법은 gdb를 이용해서 # gdb -q ./attackme  →  (gdb) disas main 확인할 수도 있구나 

그렇다면 버퍼를 덮어썼을 때 리턴주소값(RET)을 내가 이렇게이렇게 해서 다른 주소를 쓸 수 있구나 

리턴하면 다른 주소로 점핑하여 종료될 때 내가 원하는 값을 실행시켜 주기도 하는구나

까지를 이해하는 것이 이 문제의 핵심임!


반응형

블로그의 정보

jennysgap

jennysgap

활동하기