[DreamHack워게임] Return Address Overwrite (패치)
작성자 정보
- za9uar 작성
- 작성일
본문
# 소스코드
// Name: rao.c
// Compile: gcc -o rao_secure rao_secure.c -fno-stack-protector -no-pie
#include <stdio.h>
#include <unistd.h>
void get_shell() {
char *cmd = "/bin/sh";
char *args[] = {cmd, NULL};
execve(cmd, args, NULL);
}
int main() {
char buf[0x28];
printf("Input: ");
scanf("%39s", buf);
return 0;
}
gets(buf)
입력받는 길이에 제한이 없음.
버퍼의 널 종결을 보장하지 않음: 입력의 끝에 널바이트를 삽입하므로, 버퍼를 꽉채우면 널바이트로 종결되지 않음. 이후 문자열 관련 함수를 사용할 때 버그가 발생하기 쉬움.
scanf(“%s”, buf)
입력받는 길이에 제한이 없음.
버퍼의 널 종결을 보장하지 않음: gets와 동일.
scanf(“%[width]s”, buf)
width만큼만 입력받음: width를 설정할 때 width <= size(buf) - 1을 만족하지 않으면, 오버플로우가 발생할 수 있음.
버퍼의 널 종결을 보장하지 않음: gets와 동일.
fgets(buf, len, stream)
len만큼만 입력받음: len을 설정할 때 len <= size(buf)을 만족하지 않으면, 오버플로우가 발생할 수 있음.
입력의 끝에 널바이트를 삽입함. 버퍼의 널 종결을 보장함.
len보다 적게 입력하면, 입력의 끝에 널바이트 삽입.
len만큼 입력하면, 입력의 마지막 바이트를 버리고 널바이트 삽입.
따라서 buf의 크기와 n이 동일할 경우, 버퍼의 뒤에 널바이트가 삽입될 수 있음.
이를 널 바이트 오버플로우(null-byte overflow)라고 부르며, 경우에 따라 심각한 보안 위협이 될 수 있음.
데이터 유실 주의: 버퍼에 담아야 할 데이터가 30바이트인데, 버퍼의 크기와 len을 30으로 작성하면, 29바이트만 저장되고, 마지막 바이트는 유실
관련자료
-
이전
-
다음