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 ();
}루피의 모험
이제 루피의 모험을 잠시 볼까요?
루피는 해적선(pirate_ship)을 타고 이스트 블루(east_blue)를 항해합니다. 여기에서 조로, 상디, 나미 등의 동료들을 만나죠. 그리고 고잉 메리 호를 만나게 되구요.

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

그리고 언젠가는 동료들을 찾고 계속 모험(연속적인 함수 호출)을 해서 루피가 라프텔에서 원피스(onepeice)를 얻을 날이 오겠죠?
"0x03 Linux RCE" 분류의 다른 글
| The Linux Kernel Module Programming Guide v2.6 | 2011/11/20 |
| linux/x86/shell_reverse_tcp2 on Metasploit | 2011/02/24 |
| 함수 에필로그(leaveret) 에 의한 스택 변화 | 2011/02/22 |
| The Lord of The BOF - Redhat 클리어!! | 2011/02/13 |
| RET Instruction in Intel Machine | 2011/02/03 |
Trackback Address:http://hisjournal.net/blog/trackback/358