표튜터와 함께하는 Pwnable/Pwnable 개념 및 정리
-
Reordering(재배치)표튜터와 함께하는 Pwnable/Pwnable 개념 및 정리 2019. 2. 20. 22:52
스택을 확인하다가 분명히 먼저선언되어있는 변수인데도 불구하고 자꾸 낮은 쪽에 쌓이는 현상이 발생했다...즉, 스택이 변수가 선언되어진 반대의 순서로 쌓였다.원인을 알아내기위해 많은 삽질을 했고 결국 친구를 통해 알아냈는데 그 이유는 바로 Reordering이라고 한다. * Thanks to Dongmin * Reordering이란재배치라는 의미로 컴파일러가 메모리 접근속도를 향상시키기위해서 진행하는 것으로최적화를 목적으로 제한된 범위 내에서 프로그램 명령의 위치를 바꾸는 것을 의미한다. 예를 들어 우리가 흔히 볼 수 있는 아주 쉬운 아래와 같은 코드가 있다. 아래는 어셈블리어로 본 소스코드이다. 한 가지 이상한점이 있다. 먼저 선언되어 스택에 쌓이면 스택 특성상 높은 곳부터 쌓여야 하는데위의 그림을 보면..
-
/proc 디렉토리 관련 정리표튜터와 함께하는 Pwnable/Pwnable 개념 및 정리 2019. 2. 19. 13:48
/proc : process의 약자이며 해당 디렉토리에 프로세들의 정보가 저장된다. /proc/self : 현재 실행 중인 프로세스의 정보가 담겨있는디렉토리이다./proc/ : 해당 PID에 대한 프로세스 정보가 담겨있는 디렉토리다. /proc//map : 현재 실행되고 있는 프로세스의 주소맵이다. procfs (proc filesystem)은 유닉스 기반 OS에서 프로세스에 대한 정보나시스템 정보를 파일 형식으로 제공하는 것을 의미한다. /proc/의 파일들을 확인해보면 크기가 0 이다. 그 이유는 procfs파일은 내부 자료구조에 접근하기 위한 인터페이스에 가깝기 때문이다. procfs 파일을 출력하려고하는 순간, procfs driver가 system call을 수행하여 procfs 파일에 대한 결..
-
PIC란표튜터와 함께하는 Pwnable/Pwnable 개념 및 정리 2019. 2. 17. 17:47
PIC (Postion Independet Code)란? 메모리의 어느 공간에든 위치할 수 있고 수정없이 실행가능한 위치 독립코드를 의미한다.이 코드를 사용하는 각 프로세스들은 이 코드를 서로 다른 주소에서 실행할 수 있고 실행 시 재배치가 필요하지 않다.즉, 공유 라이브러리 내의 심볼들이 어느 위치에 있더라도 동작하게 해준다. 보통 공유라이브러리를 만들때 -fPIC옵션을 이용해서 코드를 컴파일하며보통 GNU/리눅스의 공유라이브러리를 만들 때 각각의 .C파일을 PIC가 가능하도록 컴파일한다. 예제를 통해 PIC가 있고 없고의 차이를 알아보겠다. 아래와 같은 소스코드가 있다. 하나는 non_PIC로 하나는 PIC로 컴파일 했다. readelf의 -d 옵션으로 생성한 공유라이브러리들의 dy..
-
정적라이브러리와 동적라이브러리로 컴파일하기표튜터와 함께하는 Pwnable/Pwnable 개념 및 정리 2019. 2. 17. 14:20
정적라이브러리와 동적라이브러리를 각각 이용한 컴파일 방법이다. Statically link와 Dynamically link의 차이는 이전의 글에서 언급했으니 참고하기 바란다.https://xn--vj5b11biyw.kr/123 정적라이브러리를 만드는 방법은 ar명령어를 이용하면 되는데ar 명령어를 이용하면 여러 프로그램에서 사용되는 함수를 포함한 오브젝트파일들을하나의 아카이브 파일( .a )로 모아놓을 수 있다. 그렇다면 한번 ar 프로그램을 이용해서 라이브러리파일 (.a)를 만들어보겠다.우선 함수를 정의한 코드를 구현한다. gcc를 이용해서 mylib.c의 오브젝트 코드를 생성한다. 그 다음으로는 위에서 만든 라이브러리 함수를 호출할 프로그램을 만든다. 정적..
-
Mitigation의 종류표튜터와 함께하는 Pwnable/Pwnable 개념 및 정리 2019. 2. 15. 07:25
MitigationASLR : Address Space Layout Randomization 메모리상의 공격을 어렵게 하기위해 스택, 힙, 라이브러리 등의 주소를 랜덤으로 프로세스 주소 공간에 배치하여 실행할 때마다 데이터의 주소가 바뀌게 하는 기법을 의미함 /proc : process의 줄임말로 이 디렉터리에 프로세스의 정보들이 저장됨 /proc/self : 현재 실행되고 있는 프로세스의 정보가 담겨있는 디렉토리 /proc/self/maps : 현재 실행되고 있는 프로세스의 주소맵 ASLR 해제 명령어 : echo 0 > /proc/sys/kernel/randomize_va_space randomize_va_space = 0 : ASLR 해제 randomize_va_space = 1 : 랜덤 스택 & ..
-
GDB 사용 시 set 명령어표튜터와 함께하는 Pwnable/Pwnable 개념 및 정리 2019. 2. 15. 04:37
gdb 사용시 set 명령어를 이용하면 자신이 원하는데로 setting을 해서 진행해볼 수 있다.예를 들어 아래와 같은 소스코드가 있다.해당 코드를 컴파일 한 뒤 gdb를 열고 got overwrite를 진행해보도록 하겠다. 컴파일 후 gdb를 이용하여 어셈블리어 코드로 보았다.printf@plt 호출 부분을 들여다보았다. 위에서도 볼 수 있듯, 현재 printf의 함수 호출 주소이다. 이 PLT(Procdure Linkage Table)는 다른라이브러리에 있는 프로시저를 호출해서 사용하는데 그 때 참조하는 것이 바로 GOT(Global Offset Table)이다.got에는 프로시저들의 주소가 들어있다.우리는 이 plt가 참조하는 프로시저들의 주소를 변조시키는 작업을 할 것이다. printf 함수호출이..
-
PLT 와 GOT표튜터와 함께하는 Pwnable/Pwnable 개념 및 정리 2019. 2. 14. 15:10
PLT와 GOT에 대해서 알아보도록 하겠다!! 이해하기전에 어떤식으로 프로그램이 컴파일되고 실행되는지를 알아야한다.C언어 코드를 예로 들어보겠다.1234567#include int main(){ printf("Hello My name is Ho ~ "); return 0;} 다음과 같은 소스코드가 있다면 이 소스 코드를 실행하기 위해서는 다음과 같은 과정이 필요하다. 우리가 만약에 printf라는 코드를 실행하기 위해서는 우선 코드를 작성하고 컴파일을 해주어야한다. 컴파일을 진행하면 obj파일이 생성되는데 생성된 obj파일은 스스로 실행을 할 수 없다. 그 이유는 소스코드 내부의 함수(printf)가 어떤식으로 구현되어있는지 obj파일은 알 수 없기 때문이다. 이러한 obj파일을 실행하게 하기위해서는 함..