본문 바로가기
반응형

Security/Pwnable70

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.
Buffer Overflow 원리 - 8086 메모리구조 8086 메모리 구조 시스템이 초기화 되기 시작하면 시스템은 커널을 메모리에 적재시키고 가용 메모리 영역을 확인하게 된다. 기본적인 명령어 집합을 커널에서 찾기 때문에 반드시 저위치에 있어야한다. 기본적으로 커널은 64KByte 영역에 자리잡지만 이를 확장하여 오늘날의 운영체제들은 더 큰 영역을 사용한다. 32bit시스템에서는 한꺼번에 처리할 수 있는 데이터가 32bit단위로 되어 있기 때문에 메모리 영역에 주소를 할당할 수 있는 범위가 0~2^32-1이다. 64bit는 0~2^64-1의 범위를 가진다. 하나의 프로그램이 실행되기 위한 메모리 구조(운영체제는 하나의 프로세스를 실행시키면 이 프로세스를 segment라는 단위로 묶어서 가용 메모리에 저장시킨다. 이 그림과 같이 오늘날 시스템은 멀티태스킹이 .. 2021. 8. 6.
FTZ Level 10 Level10 으로 접속하여 힌트를 보면 여기서 공유메모리와, key_t의 값 7530이 핵심 포인트이다. 우선 공유메모리에 대해서 알아보면 프로세스들은 원래 자신에게 할당된 메모리만 사용할 수 있는데, 프로그램 특성상 여러 프로세스들이 특정 메모리 영역을 공유할 때가 있는데 이것을 공유메모리라고 한다. 공유메모리는 알았고 key_t 값 7530이 있다. 이것을 보고 유추할 수 있는게 프로그램을 작성하여 key_t값을 활용하여 해당 공유 메모리를 통해 level11의 비밀번호를 가져오는 것이라고 알수 있다. 우선 공유 메모리와 관련된 내용을 구글링 해보았다. 대표적으로 shmget, shmat함수가 있다. shmget함수로 key 값을 사용해 원하는 공유 메모리에 요청을 하고 shmat함수로 해당 메모리.. 2021. 8. 6.
반응형