본문 바로가기

보안/시스템 보안

버퍼 오버 플로우 실습 5

 

이전에 실습한 내용을 복사한 후

nobody_call_me 라는 함수를 만든다.

소스를 보다 싶히 nobody_call_me()를  main에서도 copier 에서도 호출하지 않는다

하지만 버퍼오버플로우를 이용해 실행을 시키려고 한다

 

실행이 잘 되는것을 확인해보자

gdb로 nobody를 실행을 시켜 보고 list를 통해 소스들도 확인해보자

이제 nobody_call_me()를 함수 시키기 위해서는 해당 함수의 주소를 알아야 해당 주소로 점프를 할수 있다

 

print (함수이름)  으로 실행을 시키면 해당 주소를 확인할수 있다

0804920a 의 주소로 알수 있다

 

소스에 string copy 하는 부분을 break을 걸어주고 실행을 시킬때 마지막에 nobody_call_me 함수이름을 써서 실행

(4 x 5=20 A를 20개 넣고 나머지 주소넣는 형식으로 입력 )

리틀인디언 때문에 2개씩 끊어서 꺼꾸로 주소를 입력해야한다.

 

....?

리턴주소에 우리가 원하는 주소가 들어가야하는데 다른 주소가 들어가 있다

이유인 즉슨  0804920a 주소에서 a가 바이너리로 입력이 되어야 하는데 char 형으로 입력이 됬기 때문이다

헥사에디터를 이용하여 해결할수 있다

 

gbd를 빠져 나오고 input 파일을 하나 만들자

나눠서 설명하자면 A는 4X4=16개로 그냥 스택 채워넣기 용이고 B는 4개값으로 ebp 값 C 또한 4개 값으로 리턴 어드레스 부분 이다 

 

그리고 나와서 hexedit 을 통해서 input1 파일을 수정할 것이다

저 사진은 오타가 났는데 hexedit이 아니라 hexeditor 이다

 

아무튼 들어가면 우리는 리턴 어드레스 부분만 바꿀것이니 CCCC 부분을 지우고 아까 그 어드레스를 적으면 된다

 

ctrl+x로 빠져 나온다

 

자 이제 여기까지 하고 이 input1 파일을 집어 넣느냐

이렇게 input1을 cat 화 시켜서 변수로 해서 nobody 파일에 입력하겠다 라는 뜻이다.

????????????????

이론대라면 그냥 버퍼오버플로우가 아니라

nobody_call_me 함수가 실행이 되어야 하는데 한다.

이것저것 다 살펴본 결과  리턴 주소값이 원하는 데로 입력이 안됬는데

아까 hexeditor에서  리턴주소를 입력할때 0804920a 여서 0a 92 04 08 로 입력했는데

이떄 0a는 아스키코드로 new line 기능으로 인식을 하여서 제대로 기능을 못한것 같다

 

교수님께 여쭤보아서 함께 해결해보려 했지만 교수님은 다음 수업때문에 제한된 시간으로는 해결하지 못하였다...ㅠ

버퍼 오버플로우를 실행할때  cat으로 실행하는게 아니라 < 로 대신하여서

./nobody $(< input1) 으로도 해보았지만 해결되지는 않았다.

 

결국 해당 함수의 주소가 변경되도록 소스를 수정하여서

새로운 주소값을 받아서 다시 실행해보니

성공적으로 실행이 되었다

현재로서는 그냥 내가 재수없게 0a가 들어있는 안좋은 주소값을 받아서 실행이 안된것이다.

반응형