overflow_example

2017. 7. 6. 19:370x04 pwnable

728x90

오버플로우는 몇 번을 공부해도 지나치지 않는 것 같다. 


C프로그램은 단순한 언어이므로 프로그래머가 프로그램을 원하는 대로 제어하고 효율적으로 만들 수 있다.


하지만, 한편으로는 프로그래머가 메모리 관리를 소홀히 하면 버퍼 오버플로우와 메모리 누수 현상이 일어날 수 있다. 


어떤 변수가 메모리에 할당돼 있을 경우 그 변수의 내용이 메모리 경계를 벗어나지 않는지 검사하는 안전장치가 있어야 한다.


안전장치가 없을 경우, 프로그래머가 의도한 버퍼의 크기를 무시하고 더 큰 크기의 버퍼를 입력할 수 있게 된다.


프로그래머가 의도하지 않은 데이터 길이를 입력하여 프로그래머가 의도하지 않은 결과를 만들어 내는 것이 버퍼 오버플로우 / 버퍼 오버런 이라고 한다. 


예제를 통해 살펴보겠다. 


해당 예제의 버퍼 크기는 8바이트 인데, 버퍼의 크기를 체크하지 않는 취약함수 strcpy를 이용하므로 해커는 임의로 크기를 늘릴 수 있다. 


#include <stdio.h>

#include <string.h>


int main(int argc, char *argv[])

{

int value = 5;

char buffer_two[8], buffer_one[8];

// buffer_one이 buffer_two보다 스택에 일찍 들어가기 때문에

// buffer_one의 주소가 더 높다 

// 출력 상 편의를 위해 출력문은 buffer_two부터 썼다.

strcpy(buffer_one,"one");

strcpy(buffer_two,"two");


printf("[BEFORE] buffer_two's address %p, context is \'%s\'\n",buffer_two,buffer_two);

printf("[BEFORE] buffer_one's address %p, context is \'%s\'\n",buffer_one,buffer_one);

printf("[BEFORE] value's address %p, vaule is \'%d\'(0x%08x)\n\n", &value,value,value);

// 이제, argv[1](2번째 매개변수)를 버퍼2에 복사한다.

printf("[STRCPY] copy %d bytes to Buffer_two\n\n",strlen(argv[1]));

strcpy(buffer_two, argv[1]);

// argv[1]에 적은 내용이 buffer_two로 복사되면서 buffer_two 기존에 있던  two를 덮어씌운다.

printf("[AFTER] buffer_two's address %p, context is \'%s\'\n", buffer_two, buffer_two);

// 만약, buffer_two의 바이트를 확 초과해버리면 buffer_one은 어떻게 될까? 값 변조가 된다.

printf("[AFTER] buffer_one's address %p, context is \'%s\'\n", buffer_one, buffer_one);

printf("[AFTER] value's address %p, value is \'%d\'(0x%08x)\n", &value, value,value);


// 스택은 거꾸로 증가한다.

// =======================================  

// 높은주소 // | buffer_one | 90                                          ^

// ======================================   ^

// ======================================   ^              

// 낮은주소 // | buffer_two | 1234 5678 90                           ^

// ======================================   ^              

return 0;



'0x04 pwnable' 카테고리의 다른 글

rtl 공부  (0) 2017.11.27
Main HEAP and Thread HEAP  (0) 2017.10.30
공부 내용  (0) 2017.10.23
Lord of Bof 2번 문제  (0) 2017.07.07
Lord Of BOF 1번 문제  (0) 2017.05.12