2017. 6. 11. 19:48ㆍSystemHacking/Protostar
Protostar stack5번 문제입니다. 쉘코드에 대해서 공부하는 문제입니다
기계어코드와 어셈블러를 이용해 쉘코드를 작성해서 사용할 수도 있지만 저는 RTL(Return to Libc) 기법을 사용하겠습니다
우선 환경변수 " code "를 선언하였고 " /bin/sh "로 초기화시켰습니다
" code "를 이용해서 쉘을 실행시킬 예정입니다
해당 소스코드는 환경변수의 주소값을 구하는 파일입니다
이러한 코드를 짜서 환경변수의 주소를 구하는 이유는 실행되는 파일의 이름의 길이에 따라서 환경변수의 주소값이 변하는 문제가 발생하는데 이를 해결하기 위한 방안입니다
그리고 다음으로 system()함수와 exit()함수의 libc내에서의 주소를 찾아야합니다
위 그림처럼 소스코드를 만들고 gdb분석을 실시합니다
함수의 시작부분에 break를 걸어준 다음 system()함수와 exit(0)함수의 libc내에서의 주소를 알아냅니다
이제 프로그램에 공격할 일만 남았습니다. stack6의 메모리구조를 분석하겠습니다
지역변수에게 80byte만큼의 공간을 할당해주고 있습니다. stack6의 스택구조는 다음과 같습니다
buffer(64bye) |
dummy(8byte) |
SFP(4btye) |
RET(4byte) |
이후실행할명령 | 인자값 |
AAA... | AAA... | AAAA | &system() | &exit() | &code |
이러한 모습으로 버퍼 오버플로우 시키면 stack6실행파일이 종료될 때 system()함수를 실행하고 해당 system()함수의 인자로
환경변수 code의 값이 들어갑니다. 그리고 exit()함수가 실행되어 프로세스는 종료됩니다
쉘이 떨어짐을 확인 할 수 있습니다. system("/bin/sh") 해당 함수가 실행된 것입니다.
RTL기법을 응용해서 root의 권한을 얻어올 수 있는데 그건 7번문제에서 말씀드리겠습니다
'SystemHacking > Protostar' 카테고리의 다른 글
Protostar Stack7 [ROP] (0) | 2017.06.12 |
---|---|
Protostar Stack6 [Channing RTL] (0) | 2017.06.12 |
Protostar Stack4 [gdb] (0) | 2017.06.11 |
Protostar Stack3 [objdump] (0) | 2017.06.11 |
Protostar Stack2 [환경변수] (0) | 2017.06.11 |