EVI$ION/SYSTEM HACKING
-
[pwnable] PLT와 GOTEVI$ION/SYSTEM HACKING 2019. 7. 19. 23:07
소스코드를 컴파일하면 오브젝트 파일이 생성되고, 이를 라이브러리와 연결시키는 링킹(Linking) 작업을 통해 최종적으로 실행 파일이 생성된다. 링킹 방식에는 Static Linking과 Dynamic Linking, 2가지 방식이 존재한다. Static Linking 방식은 실행파일 내에 필요한 라이브러리 내용을 모두 포함하여 파일을 생성한다. 실행파일 내에 모든 코드가 포함되기 때문에 라이브러리를 따로 연동하고 관리할 필요가 없다. 하지만 파일의 용량이 크고, 같은 라이브러리를 사용하더라도 해당 라이브러리를 사용하는 파일들은 라이브러리 내용을 모두 메모리에 매핑시켜야한다는 단점이 있다. 반면 Dynamic Linking 방식은 공유 라이브러리를 사용하기 때문에 Static Linking 방식과 달리 ..
-
[시스템해킹 #5] RET SLED, FEBPEVI$ION/SYSTEM HACKING 2019. 6. 24. 22:45
[RET SLED] ret: 어셈블리어 명령어. POP EIP, JMP EIP RET: 리턴 어드레스 어셈블리어 명령어인 ret과 리턴 어드레스를 의미하는 RET은 철자가 같아 혼동의 여지가 있다. 이 둘의 구분을 위해 어셈블리어 명령어인 ret을 '가젯'이라 부르고, ret의 주소를 '가젯 주소'라 한다. (하지만 보통 가젯과 가젯 주소는 어셈블리어 ret의 주소로 혼용되곤 한다.) 가젯은 코드 영역에 위치하기 때문에 컴파일 시에 결정되고 고정적이다. RET SLED의 목적은 ret(어셈블리어) 명령을 한번 더 실행시킴으로써 shellcode를 실행시키는 것이다. 리턴 어드레스(RET)에 ret 가젯을 삽입함으로써 리턴 어드레스를 뒤로 지연시키기 때문에 SLED라고 하며, 삽입된 ret 가젯을 통해 s..
-
[시스템해킹 #4] NOP Sledding, strcpy와 gets, 링크, RTLEVI$ION/SYSTEM HACKING 2019. 5. 13. 00:49
[NOP Sledding] NOP Sled, NOP Slide, NOP Sliding이라고도 한다. NOP(No-OPeration)은 어셈블리어 명령어 중 하나로, 기계어 표현은 운영체제에 따라 다르다. (Linux: \x90, Window: 0x1C0C1C1C) NOP Sledding은 의미 있는 명령어가 나올 때까지 실행 포인터를 이동시키는 기법이다. 즉, 고의적으로 실행 흐름을 늦추는 것으로, 쉘코드의 위치가 불분명할 때 NOP Sledding 기법을 사용한다. (※ 주의: 쉘코드를 삽입할 때 적어도 쉘코드의 앞뒤에는 NOP을 넣어주는 것이 좋다. 쉘코드가 스택의 범위를 넘어서서 쉘코드가 정상적으로 실행되지 않을 수 있기 때문이다.) NOP Sledding은 시스템해킹 뿐만 아니라 웹해킹에서도 사용..
-
[시스템해킹 #3] 메모리 보호 기법, 쉘코드, 환경변수EVI$ION/SYSTEM HACKING 2019. 5. 6. 03:32
[메모리 보호 기법] ASLR (Address Space Layout Randomization) ASLR은 메모리 상의 공격을 어렵게 하기 위해 스택이나 힙, 라이브러리 등의 주소를 랜덤으로 프로세스 주소 공간에 배치함으로써 실행할 때마다 데이터의 주소가 바뀌게 하는 메모리 보호 기법이다. 주소가 완전히 랜덤으로 바뀌는 것은 아니고, 순서와 패턴은 어느 정도 유지한다. ASLR의 적용 여부는 cat /proc/self/maps 명령을 통해 알 수 있다. /proc는 process의 준말로, 프로세스의 정보들이 저장되는 디렉터리이다. /proc/self는 현재 실행되고 있는 프로세스의 정보가 저장되어 있는 디렉터리이고, /proc/self/maps는 현재 실행되고 있는 프로세스의 주소 맵을 가리킨다. 아래..
-
[시스템해킹 #2] 어셈블리어, 함수 프롤로그/에필로그, gdb, setUIDEVI$ION/SYSTEM HACKING 2019. 5. 5. 21:51
저번 시간에 했던 어셈블리어를 복습 겸 다시 되짚어보았다. [어셈블리어] CALL [접근할 함수 주소] PUSH EIP // 현재 EIP가 가리키는 값을 스택에 저장한 뒤 JMP [접근할 함수 주소] // [접근할 함수 주소]로 점프한다. PUSH [인자] 스택 영역에 4바이트 공간을 할당하고, [인자] 값을 스택에 저장한다. CALL 전에 PUSH가 나오는 경우, PUSH는 인자를 전달하는 역할을 한다. POP [인자] ESP가 가리키는 곳의 값을 [인자]에 저장한 후, ESP가 가리키는 곳이 4바이트 올라간다. RET POP EIP // ESP가 가리키는 값을 EIP에 저장하고 ESP가 4바이트 올라간다. JMP EIP // 방금 저장한 EIP 값으로 점프한다. SUB [인자1], [인자2] 인자1 ..
-
[시스템해킹 #1] 함수의 호출/복귀 원리, 메모리 구조, 스택 프레임, 함수 프롤로그/에필로그, 지역변수/전역변수 할당, 어셈블리어 기EVI$ION/SYSTEM HACKING 2019. 5. 5. 00:48
[함수의 호출/복귀 원리] 아래 코드의 메인 함수 내에서 정의된 함수(get_area)가 호출되면, 컴파일러는 해당 함수(get_area)의 시작점으로 간다는 의미의 기계어를 생성한다. 이 기계어로 인해 프로그램 실행 도중에 함수를 만나면(12번 라인) 프로그램은 함수의 시작점(1번 라인)으로 되돌아가 함수를 수행한다. 함수 수행을 모두 끝마치면 프로그램은 처음 함수가 호출된 곳으로 다시 되돌아가는데, 그 이유는 함수의 리턴값을 변수(area)에 저장해야 하기 때문이다. 그런데 같은 함수를 여러 번 사용하는 경우, 함수가 호출된 위치를 미리 기록해두지 않으면 함수 수행이 끝난 뒤 그 다음 코드로 되돌아갈 수 없기 때문에 프로그램이 무한 루프에 갇힐 위험이 있다. 그래서 프로그램은 함수가 호출되기 직전, ..