BOF에 의한 연속적인 함수 호출 – 루피의 모험

함수 A가 종료되고 함수 B가 곧바로 실행될 때의 스택의 변화를 살펴보면, 함수의 에필로그(leaveret) 때문에 esp+4의 값이 새로운 return address가 되는 것을 알 수 있습니다.[^1] 이러한 특성 때문에 프로그램에 BOF 취약점이 존재할 때 연속적인 함수 호출이 가능해집니다.

다음은 BOF 취약점이 있는 예제 소스입니다. 한 눈에 봐도 4byte 크기의 버퍼가 오버플로우 되는 것을 알 수 있습니다.

#include <stdio.h>
#include <string.h>

void east_blue ()
{
    printf ("Discover the Onepiece!!\n");
}

void grand_line ()
{
    printf ("The Onepeice is real!!\n");
}

void onepeice ()
{
    printf ("The Onepeice is mine!! PUHAHAHAH!!\n");
}

int main (int argc, char **argv)
{
    int pirate_ship;

    strcpy ((char *)&pirate_ship, argv[1]);
    east_blue ();
}


루피의 모험

이제 루피의 모험을 잠시 볼까요?

사용자 삽입 이미지[그림 2] 이스트 블루로~!

루피는 해적선(pirate_ship)을 타고 이스트 블루(east_blue)를 항해합니다. 여기에서 조로, 상디, 나미 등의 동료들을 만나죠. 그리고 고잉 메리 호를 만나게 되구요.

사용자 삽입 이미지[그림 3] 그랜드 라인에서 흰수염의 외침 “원피스는 실존한다!”

정상적인 흐름이라면 이스트 블루 안에서만 다녀야 하지만, 나미의 뛰어난 항해술(readelf & grep) 덕분에 리버스 마운틴의 해류(BOF)를 타서 그랜드 라인(grand_line)으로 들어갈 수 있습니다. 이곳에서 루피는 일행들과 떨어지고, 해군과 흰수염 해적단의 전쟁이 발발합니다. 그리고 흰수염의 외침!

사용자 삽입 이미지[그림 4] 원피스는 누구에게?

그리고 언젠가는 동료들을 찾고 계속 모험(연속적인 함수 호출)을 해서 루피가 라프텔에서 원피스(onepeice)를 얻을 날이 오겠죠?


  1. 함수 에필로그(leaveret) 에 의한 스택 변화

Similar Posts

  • 우분투용 해킹 & 분석 도구 모음

    리눅스에서는 해킹 & 분석용으로 많은 도구들이 있습니다. 그리고 다들 강력하죠. 그런데 리눅스는 배포 버전이 다양해서 일일이 소스를 컴파일 해주어야 합니다. 그리고 의존성에 걸리거나 약간의 다른 환경 문제 때문에 컴파일이 안 되거나 실행이 안 되는 경우가 있죠. 도구모음 :: http://archive.offensive-security.com/ 위 링크를 따라 가시면 많은 deb 패키지들이 있습니다. 우분투용 해킹 & 분석 도구들이죠. 컴파일하기 살짝 까다로웠던…

  • RET Instruction in Intel Machine

    Intel 머신에서는 함수의 에필로그(Epilogue) 마지막에 RET 명령이 있습니다. 이 명령은 현재의 ESP(스택 포인터)를 참조하여서 함수가 종료된 후 이전의 실행흐름으로 되돌아가는 명령입니다. 그래서 하나의 함수가 실행되면서 중간중간 다른 함수가 실행되어도 흐름이 유지될 수 있는 것이죠. 어떤 문서에 보니까 RET 명령을 다음과 같이 설명하고 있었습니다. 위 코드대로라면, BOF를 이용한 연속적인 함수 호출이나 RTL(Return-to-Libc) 등이 설명되지 않습니다. 덕분에…

  • OpenSSH 제로데이 익스플로잇, 속지 마세요.

    인터넷에 OpenSSH의 제로데이 익스플로잇이라고 소개하며 떠도는 소스파일이 있습니다 openssh0day.c 인데요. 저는 버그트럭에서 Justin Kim 님이 올리신 글 덕분에 이게 가짜란 것을 알았습니다. 시험삼아 버추어박스로 페도라를 띄운 후 컴파일해서 실행 해봤는데요. /home 폴더 아래의 모든 데이터를 날리더군요. 정말 어처구니가 없는 녀석이었습니다. 아래는 openssh0day.c 안의 쉘코드 내용입니다. 실제로는 아스키 문자로 되어 있는 것을 printf() 함수로 출력하였습니다. 보시다시피…

  • linux/x86/shell_reverse_tcp2 on Metasploit

    위 쉘코드는 메타스플로잇[^1]에서 linux/x86/shell_reverse_tcp2 모듈로 만든 코드입니다. Remote Exploit을 할 때 사용하는 코드인데 어떻게 수행되는지 알아보고자 분석해봤습니다. 우선 시스템함수와 int 0x80을 이용한 코드를 분석할 때는 다음을 유념해야 합니다. eax 레지스터는 시스템함수 번호 (syscall number) ebx, ecx, edx 순으로 함수의 인자들이 구성 그래서 분석을 할 때 int 0x80이 나오기 전에 eax의 값을 확인해야 하고, 그에 맞는…

  • 함수 에필로그(leaveret) 에 의한 스택 변화

    아래 로그는 함수 프롤로그와 에필로그를 거치면서 스택이 어떻게 변하는지를 보여줍니다. ebp가 0xbfffff00 라고 가정하여서 계산을 하였습니다. 결론은 함수 에필로그(leaveret)에 의해 RET가 저장되는 스택의 다음 4바이트가 새로운 RET가 된다는 것입니다. 그래서 이런 특성이 RTL(Return to Libc)이나 연속적인 함수 호출에 이용됩니다.

  • The Linux Kernel Module Programming Guide v2.6

    Articles에 문서를 업데이트 했습니다. CERT-IS의 남윤민 군의 번역문서입니다. task_struct 구조가 변경되기 전의 Linux Kernel 2.6 버전에서 커널 모듈을 어떻게 작성하는 지를 설명한 기초 문서입니다. 아래의 링크는 이 문서의 원본과 KLDP에 있는 2.4 버전의 번역 문서입니다. The Linux Kernel Module Programming Guide 2.6 (원문) The Linux Kernel Module Programming Guide 2.4 (번역/KLDP)

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다