해킹/시스템해킹

[시스템해킹 도전기 7편] Stack Buffer OverFlow(2)

놀고싶다~ 2021. 2. 10. 10:00

안녕하세요! 

 

오늘은 지난 시간에 이어서 버퍼오버플로우 공격에 대해 알아보도록 하겠습니다!

 

오늘은 직접 공격코드를 구현하고 실행하는 부분으로 마무리 지어보도록 하겠습니다.

 

먼저 오늘 공격에 사용될 코드를 작성해보겠습니다.

위 코드를 작성한 후 컴파일하여 실행할 수 있는 setuid 비트까지 걸어 줄 수 있도록 하겠습니다.

 

이제 bof 파일을 gdb로 분석해보겠습니다.

 

이해하기 어려우실수도 있을거같아서 위 부분을 구조로 나타내기위해 간단한 그림을 그려보았습니다!

 

위 그림과 같이 우리는 RET에 도달을 해야 하기 때문에 EBP-520부터 EBP+4 까지 도달하기 위해서는 524개의 인자가 필요함을 먼저 알 수 있습니다.

이 부분을 아래의 그림으로 한 번 더 설명드리겠습니다.

 

이제 어떻게 공격을 해야할지 위치를 찾았고 공격을 할 수 있도록 준비를 하는 과정을 알아보겠습니다.

 

저희가 공격을 할 계정은 일반계정입니다 따라서

환경변수에 쉘코드를 주입하여서 일반사용자가 쉘을 획득 하는 것으로 공격을 시도해보겠습니다.

 

먼저 항상 스택값이 매번 바뀐다는 것을 알아보기 위해 코드 하나를 작성하겠습니다. 

 

위 test 파일을 통해서 컴파일 이후 주소값이 어떻게 변하는지 알아보겠습니다.

 

이처럼 매번 달라지는 주소값으로 인해서 우리는 환경변수 주소를 획득한 뒤 쉘코드를 넣는 방법으로 진행하겠습니다.

 

먼저 환경변수 주소를 구하는 코드를 구현하였습니다.

 

위 코드를 임의로 실행한 값은 아래와 같습니다.

 

이제 우리가 환경변수를 통해서 어떻게 공격을 할지 그림으로 나타내보겠습니다.

 

먼저는 A값인 임의의 값을 통해서 524byte를 채워준 뒤에 환경변수 주소를 구해준 값에 우리는 쉘코드를 주입 할 것입니다 그렇게 되면 환경변수 주소를 실행시킴과 동시에 쉘을 획득 할 수 있다는 것을 알 수 있습니다.

 

이제 직접 환경변수 주소를 획득하고 거기에 쉘코드를 넣고 실행하는 과정까지 진행 해보겠습니다.

 

새로운 환경변수에 쉘코드를 넣고 진행을 하였습니다.

언어팩이 한글로 되어있는지 설정을 먼저 해주고 시작해야합니다.

 

그리고 이제 주소를 통해 bof 파일을 실행시켜서 쉘을 획득하는 공격을 시도하겠습니다.

 

./bof `perl e ‘print “A”x524,“\xcd\xfe\xff\xbf”’`를 통해서 쉘을 획득할 수 있는 것을 보게 되었습니다

 

이로써 Buffer Overflow 공격을 마무리 하겠습니다.

 

제가 보여드린 주소들은 실습하시는 환경이나 버전이 다르실 수 있으니 이점 유의하셔서 해주시면 감사하겠습니다!

 

수고많으셨습니다!