시스템 해킹

 1576, 1/79 회원가입  로그인  
   khs790809
   버퍼오버플로우

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=1728 [복사]



프로그램을 짜다보면 메모리에 퍼버가 넘쳐 fault 트가된다.
이떄 fault의 위치에 내가원하는 명령어를 넣는다면 시스템을 가질수잇다
이게 버퍼오버플로우잖아요
중요한건 실제워게임을 풀떄까지 문제입니다.
1. 램에 데이터가 저장돠는 방식이궁금합니다. (리틀엔디안,빅엔디안)
2. 버퍼를 넘치게 할려면 현제 코드에 버퍼를 몇개를 넣어야 넘치는지를알아야하잖아요?
무작정 10만개 100만개 넣어서 넘친다는건 아니라고 생각하는데요
3버퍼의 넘쳐나는 위치를 알앗으면 넘치기적전에 쉘코드를 넣는데. 이 쉘코드는 어떻게 짜는거죠?
쉘코드를 간단히짜주는프로그램이라는게 에그쉘이맞나요? 그럼 어떠한 취약점에서도 예그쉘파일만 가지고잇으면
적절할 쉘코드를 쉽게 만들어줄는잇는건가요?


요정도만 이해하면 보프원정대 시도해볼자신감이 생길거같습니다..

고수님들은 조언부탁드립니다.

  Hit : 4105     Date : 2014/01/31 08:52



    
cd80 질문 위에 버퍼오버플로우를 정의하신부분이 약간 애매한것같아 다시 써보자면
버퍼오버플로우는 메모리의 복사가 일어날 때 복사한 데이터를 써넣는 영역을 넘어선 크기의 데이터가 복사될경우 일어납니다
스택버퍼오버플로우의 경우 스택에 존재하는 변수들의 데이터를 덮어씌우거나 리턴어드레스를 변조할 수 있고
리턴어드레스를 변조함으로써 프로그램의 실행을 조작할 수 있습니다
이를 이용해 현재 실행되고 있는 프로그램의 권한을 획득하는것이구요

ftz level11을 예로 들어보겠습니다
int main(int argc, char **argv){
,,,,,,,,char buf[256];
,,,,,,,,strcpy(buf, argv[1]);
,,,,,,,,return 0;
}
이 프로그램의 실행권한을 제어할 수 있는 이유는
strcpy에 의해 buf에 argv[1]이 제한없이 데이터가 들어가
main함수를 call 할때 스택에 들어간 리턴어드레스가 덮어씌워지고
main함수 마지막 ret명령에서 덮어씌워진 리턴어드레스가 eip로 들어가기 때문입니다
따라서 main함수의 스택프레임 레이아웃은 아래처럼 생겼습니다

ret
sfp
-------------- <- ebp
|,,,,,,,,,f,,,,,,,,,,|
|,,,,,,,,,u,,,,,,,,,|
|,,,,,,,,,b,,,,,,,,,|
-------------- <- esp

strcpy에 의해 buf의 처음부터 데이터가 들어가고
buf[256] + sfp[4] + ret[4] = 264바이트를 argv[1]에 넣게되면
strcpy로 buf[256]에 264바이트가 들어가게 되어 리턴어드레스가 덮어씌워지게됩니다

1. 프로세서 계열에 따라 다르지만 인텔 프로세서는 리틀엔디안 방식을 사용합니다
2. 당연한 말이지만 버퍼의 크기를 넘어서는 데이터를 넣어주시면 됩니다
gdb 등으로 확인하실 수 있습니다
3. 쉘코드는 쉘을 실행하는 코드라 해서 쉘코드라 부릅니다
보통 시스템콜을 이용하고
어셈블리어로 작성하셔도 되고 C로 작성해서 쓸수있는 형태로 만드셔도됩니다
쉘코드 작성은 어셈블리어로 하시는게 더 편합니다

에그쉘은 쉘코드를 작성해주는 프로그램이 아니라
환경변수에 쉘코드를 넣고 환경변수상에서 쉘코드가 위치하는 주소를 알려주는 프로그램입니다
2014/02/01  
khs790809 친절한 설명 감사드리니다... 프린터로 뽑아서 게속읽어야겟어요
제가 알고잇던 버프 가 스택오버플러우 엿군요.. 새론운것도 알아갑니다..새해복많이받으세요
2014/02/02  
kumi123 1. 램에 데이터가 저장돠는 방식이궁금합니다. (리틀엔디안,빅엔디안)
-> cpu를 보면 알 수 있습니다... x86 아키텍쳐를 쓰면, 리틀에디안, IBM SPAC 을 쓰면 빅에디안

2. 버퍼를 넘치게 할려면 현제 코드에 버퍼를 몇개를 넣어야 넘치는지를알아야하잖아요?
무작정 10만개 100만개 넣어서 넘친다는건 아니라고 생각하는데요
-> 세그먼트 펄스가 처음뜨는 부분이 ret 입니다.

3버퍼의 넘쳐나는 위치를 알앗으면 넘치기적전에 쉘코드를 넣는데. 이 쉘코드는 어떻게 짜는거죠?
쉘코드를 간단히짜주는프로그램이라는게 에그쉘이맞나요? 그럼 어떠한 취약점에서도 예그쉘파일만 가지고잇으면
적절할 쉘코드를 쉽게 만들어줄는잇는건가요?
-> 어셈블리어랑 시스템콜 구성방법을 알면 짜실수 잇습니다.
2014/02/03