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)를 얻을 날이 오겠죠?
- 함수 에필로그(leaveret) 에 의한 스택 변화