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

2011/03/01 13:03

함수 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)를 얻을 날이 오겠죠?

크리에이티브 커먼즈 라이센스
Creative Commons License

6l4ck3y3 0x03 Linux RCE ,

Trackback Address:이 글에는 트랙백을 보낼 수 없습니다