본문 바로가기
반응형

bufferoverflow7

Buffer Overflow 원리 - 공격-1 고전적인 방법 Buffer Overflow 공격 아래 코드의 프로그램을 사용할 것이다. 소스코드를 보면 실행 시 주어지는 첫 번째 인자를 buffer라는 char형 배열에 복사한다. 또한, bound check를 하지 않는 strcpy()함수를 이용하고 있다. 그렇다면 아마도 이 프로그램은 1024바이트의 버퍼 공간에 쉘 코드와 NOP로 채우고 4바이트는 main함수의 BP이므로 역시 NOP으로 채우고 다음 만나는 4바이트가 return address이므로 이곳에 쉘코드가 있는 곳의 address를 넣어주면 쉘코드를 실행시킬 수 있을 것이다. 그렇다면 이 쉘 코드가 있는 곳의 address찾는 것이 가장 큰 문제가 된다. 고전적인 방법 가장 고전적인 방법으로는 추측하는 것이다. 몇 번의 시행착오를 거치면서 쉘이 떨어질.. 2021. 8. 8.
Buffer Overflow 원리 - 쉘코드 쉘 코드 만들기 쉘코드를 만들어보자. 쉘 코드란 쉘(shell)을 실행시키는 코드이다. 쉘은 흔히 명령 해석기라고 불리는데 일종의 유저 인터페이스라고 보면 된다. 사용자의 키보드 입력을 받아서 실행파일을 실행시키거나 커널에 어떠한 명령을 내릴 수 있는 대화통로이다. 쉘 코드는 바이너리 형태의 기계어 코드이다. 우리는 쉘 코드를 만들어야 하는 이유는 실행중인 프로세스에게 어떠한 동작을 하도록 코드를 넣어 그 실행 흐름을 조작 할 것이기 때문에 역시 실행 가능한 상태의 명령어를 만들어야 하기 때문이다. 만약 공격자가 기계어 코드에 능통하다면 직접 기계어 코드를 작성해도 좋을 것이다. 하지만 지금은 CPU instruction의 종류가 늘어났고 너컬이 복잡해져서 아주 힘든 작업이다. 그래서 C를 이용하여 간단.. 2021. 8. 6.
Buffer Overflow 원리 - Buffer overflow의 이해 버퍼(buffer)란 시스템이 연산 작업을 하는데 있어 필요한 데이터를 일시적으로 메모리 상에 저장하는 공간이다. (문자열을 처리할 것이면 문자열 버퍼가 되고, 수열이라면 숫자형 데이터 배열이 된다.) 대부분의 프로그램에서는 버퍼를 스텍에다 생성한다. 스텍은 함수 내에서 선언한 지역 변수가 저장되게 되고 함수가 끝나고 나면 반환된다. (이것은 malloc()과 같은 반영구적인 데이터 저장 곤간과는 다른 것이다.) buffer overflow의 동작원리 버퍼오버플로우는 미리 준비된 버퍼에 버퍼의 크기 보다 큰 데이터를 쓸 때 발생하게 된다. 40바이트의 스텍이 준비되어 있다고 가정해보자. 만약 40바이트 보다 큰 데이터를 쓰면, 버퍼가 넘치게 되고 프로그램은 에러를 발생시키게 된다. 40바이트가 아닌 41.. 2021. 8. 6.
Buffer Overflow 원리 - 프로그램 구동시의 segment (2) EIP는 main()함수의 시작점을, ESP는 스텍의 맨 꼭대기를 가리킨다. ESP가 스텍의 맨 꼭대기를 가리키는 이유는 피로그램이 수행되면서 수많은 PUSH와 POP 명령을 할 것이기 때문이다. PUSH명령이 ESP가 가리키는 아래 지점에다 데이터를 넣을 것인지는 시스템 구조에 따라 다르다. 마찬가지로 POP명령이 ESP가 가리키는 지점의 데이터를 가져갈 것인지 아니면 ESP가 가리키는 지점 위의 데이터를 가져갈 것인지 역시 다르게 동작한다. ebp를 저장하는 이유는 이전에 수행하던 함수의 데이터를 보존하기 위해서이다. (이것을 base pointer라고도 부른다.) 함수가 시작될 때에는 이렇게 stack pointer와 base pointer를 새로 지정하는데 이러한 과정을 함수 프롤로그 과정이라고 .. 2021. 8. 6.
Buffer Overflow 원리 - 프로그램 구동시의 segment (1) 프로그램이 실행되어 프로세스가 메모리에 적재되고 메모리와 레지스터가 어떻게 동작하는지 알아보기 위하여 간단한 프로그램을 예제로 본다. gcc로 컴파일 해주고 gdb를 통해 disassamble을 해준다. 앞에 붙어 있는 주소는 logical address이다. 이 주소를 자세히 보면 function()함수가 아래에 자리 잡고 main()함수는 위에 자리잡고 있음을 알 수 있다. 위 그림과 같이 segment가 구성되었다. (메모리 주소는 임의로 적었습니다.) 이 프로그램에서는 전역변수를 지정하지 않았기 때문에 data segment에는 링크된 라이브러리의 전역변수 값만 들어있을 것이다. 이 프로그램이 시작되면 EIP 레지스터 즉, CPU가 수행할 명령이 있는 레지스터는 main()함수가 시작되는 코드를 .. 2021. 8. 6.
Buffer Overflow 원리 - 8086CPU 레지스터 구조 REGISTER 레지스터 명령어의 집합과 데이터들의 저장공간 범용 레지스터 논리 연산, 수리연산에 사용되는 피연산자, 주소를 계산하는데 사용되는 피연산자, 그리고 메모리 포인터가 저장되는 레지스터 세그먼트 레지스터 Code segment, Data segment, Stack segment를 가리키는 주소가 들어가 있는 레지스터 플래그 레지스터 프로그램의 현재 상태나 조건 등을 검사흔ㄴ데 사용되는 플래그들이 있는 레지스터 인스트럭션 포인트 다음 수행해야 하는 명령이 있는 메모리 상의 주소가 들어있는 레지스터 1. 범용 레지스터 프로그래머가 임의로 조작할 수 있게 허용되어 있는 레지스터. 일종의 4개의 32bit 변수라고 생각하면된다. 예전의 16bit 시절에는 각 레지스터를 AX, BX, CD, DX.. .. 2021. 8. 6.
반응형