본문 바로가기

개념정리/System Hacking

(11)
[System Hacking] 쉘 코드 모음(32비트, 64비트) 1. 32비트 쉘 코드 25 Bytes Shell Code (기본) \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80 26 Bytes Shell Code (scanf 우회 : scanf는 \x09, \x0a, \x0b, \x0c, \x0d, \x20를 읽지 못한다.) \x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80 41 Bytes Shell Code (setreuid(geteuid(), getreuid()) 포함) \x31\xc0\xb0\..
[System Hacking] Stack Buffer Overflow 1. 버퍼 버퍼는 데이터가 목적지로 이동되기 전에 보관되는 임시 저장소이다. 데이터의 처리 속도가 다른 두 장치가 있을 때, 둘 사이에 오가는 데이터를 임시로 저장해 두는 것을 완충 작용이라고 한다. 데이터의 처리 속도가 다른 두 장치 사이에 별도의 장치가 없다면, 유실되는 데이터가 발생한다. 이런 문제를 해결하고자 수신 측과 송신측 사이에 버퍼라는 임시 저장소를 두고, 이를 통해 간접적으로 데이터를 전달하게 한다. 즉, 송신 측은 버퍼로 데이터를 전송하고, 수신 측은 버퍼에서 데이터를 꺼내 사용한다. 이렇게 버퍼를 이용하면 버퍼가 가득 찰 때까지 유실되는 데이터 없이 통신할 수 있다. 스택에 있는 지역 변수는 스택 버퍼, 힙에 할당된 메모리 영역은 힙 버퍼라고 한다. 2. 버퍼 오버플로우 버퍼 오버플로..
[System Hacking] 함수 호출 규약 1. 함수 호출 규약 함수 호출 규약은 함수의 호출 및 반환에 대한 약속이다. 한 함수에서 다른 함수를 호출하면 프로그램의 실행 흐름은 다른 함수로 이동한다. 그리고 호출한 함수를 반환하면 원래 함수로 돌아와서 기존의 실행 흐름을 이어간다. 그러므로 함수를 호출할 때는 반환된 이후를 위해 호출자의 상태(Stack frame) 및 반환 주소(Return address)를 저장해야 한다. 또한 호출자는 피호출자가 요구하는 인자를 전달해줘야 하며, 피호출자의 실행이 종료될 때는 반환 값을 전달받아야 한다. 함수 호출 규약을 적용하는 것은 일반적으로 컴파일러의 몫이다. 그러나 컴파일러의 도움 없이 어셈블리 코드를 작성하거나 어셈블리로 작성된 코드를 읽고자 한다면 함수 호출 규약을 알아야 할 필요가 있다. 컴파일..
[System Hacking] Shellcode 1. 익스플로잇 해킹 분야에서 상대 시스템을 공격하는 것이다. 상대 시스템에 침투하여 시스템을 악용하는 해킹과 같다. 2. 셸코드 셸코드는 익스플로잇을 위해 제작된 어셈블리 코드 조각을 말한다. 셸을 획득하기 위한 목적으로 셸코드를 사용해서 셸이 접두사로 붙었다. 셸코드는 어셈블리어로 구성되므로 공격을 수행할 대상 아키텍처와 운영체제에 따라 다르게 작성된다. 아키텍처 별로 자주 사용되는 셸코드를 모앗 공유하는 사이트가 있다. 하지만 최적의 셸코드는 일반적으로 직접 작성하는 것이 좋다. 3. orw 셸코드 orw 셸코드는 파일을 열고, 읽은 뒤 화면에 출력해주는 셸코드이다. 밑에 코드는 orw 셸코드를 C언어 형식의 의사코드로 표현한 것이다. char buf[0x30]; int fd = open("/tmp..
6. pwntools 저번 시간에는 gdb 디버거에 대하여 공부하였다. 이번 시간은 pwntools에 대하여 공부할 것이다. 1. pwntools 프로그램에 대하여 익스플로잇을 수행할 때 효율적이고 편하게 도움주는 파이썬 모듈이다. 파이썬으로 여러 개의 익스프로잇 스크립트를 작성하다보면 자주 사용되는 함수들이 있다. 예를 들어 패킹 함수, 언패킹 함수들은 익스프로잇 과정에서 항상 필요하다. 이런 함수들을 반복적으로 구현하는 것은 비효율적이기 때문에 시스템 해커들이 편리성을 위해 제작하였다. 2. pwntools 설치 pwntools는 깃허브에 오픈 소스로 공개되어 있다. 1) 밑에 명령어를 이용하여 리눅스에 pwntools를 설치한다. $ apt-get update $ apt-get install python3 python3..
5. gdb 디버거 이번 시간은 리눅스의 대표적인 디버거 gdb에 대해서 공부 할 것이다. pwndbg 설치 및 기능을 공부한다. 1. 디버거 디버거는 버그를 없애기 위해 사용하는 도구이다. 프로그램을 개발할 때는 일반적으로 코드의 논리 구조를 신중하게 설계하고 코드를 작성한다. 하지만 아무리 신중하게 설계해도 규모가 커지면 실수가 발생한다. 컴퓨터과학에서는 이러한 실수로 발생한 프로그램의 결함을 버그라고 한다. 또한 이미 완성된 코드에서 버그를 찾는 것은 어렵다. 그래서 이런 어려움을 해소하고자 디버거라는 도구가 개발되었다. 그러나 디버거의 효용을 개발자만 얻는 것이 아니라 해커, 리버스 엔지니어 등도 디버거를 사용하여 버그 탐색의 효율을 높인다. 개발자는 버그를 고치기 쉬워졌고, 해커는 취약점을 발견하기 쉬워졌다. 리눅..
4-2. 어셈블리(Assembly) - 스택, 프로시저, 시스템콜 저번 시간에는 기계어와 어셈블리 기본구조, 산술연산, 논리연산, 비교, 분기를 공부하였다. 다시 공부하고 싶다면 밑에 링크를 참고하면 된다. 4-1. 어셈블리(Assembly) 1. 기계어 CPU가 직접 해독하고 실행할 수 있는 비트 단위로 쓰인 컴퓨터 언어이다. 0과 1로만 구성돼 있어서 단어 위주로 문장을 구사하는 사람으로서 이해하기 어렵다. 2. 어셈블리 언어 기계어 sungw00k.tistory.com 이어서 이번 시간에는 스택, 프로시저, 시스템콜에 관련된 어셈블리를 공부할 것이다. 1. Opcode : 스택 스택을 조작할 수 있는 명령어로 1)push, 2)pop이 있다. 1) push push val : val을 스택 최상단에 쌓는다. 연산 rsp -= 8 [rsp] = val 2) pop ..
4-1. 어셈블리(Assembly) - 산술연산, 논리연산, 비교, 분기 이번 시간은 해커의 언어인 어셈블리에 대하여 공부할 것이다. 1. 기계어 CPU가 직접 해독하고 실행할 수 있는 비트 단위로 쓰인 컴퓨터 언어이다. 0과 1로만 구성돼 있어서 단어 위주로 문장을 구사하는 사람으로서 이해하기 어렵다. 2. 어셈블리 언어 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍 저급 언어이다. 컴퓨터 구조에 따라 사용하는 기계어가 달라지며, 어셈블리 언어도 달라진다. 3. 어셈블러 어셈블리어로 작성한 코드를 컴퓨터가 이해할 수 있는 기계어로 코드를 치환해 주는 일종의 통역사이다. 4. 어셈블리 언어 기본 구조 어셈블리 언어는 동사에 해당하는 명령어(Opcode)와 목적어에 해당하는 피연산자(Operand)로 구성된다. 5. 어셈블리 명령어 - 데이터 이동: mov, lea 어떤 값을 ..