연구실:System

[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바이트만 저장되고, 마지막 바이트는 유실

관련자료

댓글 0
등록된 댓글이 없습니다.

최근글


새댓글


  • 댓글이 없습니다.