Tmux 설치터미널 화면을 분할해서 사용하고자 할 때 흔히 'Terminal multiplexe' 종류의 소프트웨어를 사용하게 되는데, 오늘 다루고자 하는 'tmux'가 그의 대표격이다. tmux는 각 운영체제의 패키지 관리자를 이용해 사용할 수 있으며 이 게시글에서는 유닉스/리눅스 기반 환경 기준으로 서술하였다. sudo apt-get install tmux 설치가 완료된 후, 실행하고자 할 때는 그냥 tmux 명령만 입력하면 된다. Tmux 주요 사용법tmux //세션 생성 tmux new -s tmux new-session -s // 이름을 지정하여 세션 생성 [Ctrl] + b, $ // 세션 이름 수정 [Ctrl] + b, d // 세션 detach tmux ls // 세션 리스트보기 tmux ..
PWNDBG 설치 seKUrity에서는 pwndbg랑 tmux가 이미 설치된 서버에서 실습을 했지만 나중을 위해 설치 방법부터 알아보겠다. 🖇️https://github.com/pwndbg/pwndbg GitHub - pwndbg/pwndbg: Exploit Development and Reverse Engineering with GDB Made Easy Exploit Development and Reverse Engineering with GDB Made Easy - GitHub - pwndbg/pwndbg: Exploit Development and Reverse Engineering with GDB Made Easy github.com git clone [URL] [DIRECTORY] git clo..
Buffer Overflow란? 버퍼오버플로우는 단어의 뜻 그대로 버퍼를 넘치게 만드는 것이다. 특정 프로그램에 할당된 버퍼에 엉뚱한 데이터를 넘치도록 집어넣어 공격자가 원하는 코드를 실행 시키는 일종의 해킹 기법이기도 하다. 여기서 말하는 버퍼(Buffer)에는 스택과 힙이 있는데, 이전 발행글 - 메모리 구조에 기술된 스택과 힙의 특징을 익히고 나면 이해가 쉬울 것이다. 프로그램 취약점 측면에서 풀어 설명하자면 다음과 같다. - 메모리 오류로 인해 잘못된 동작을 하는 프로그램 취약점. - 프로세스가 데이터를 버퍼(힙 또는 스택)에 저장할 때 프로그래머가 지정한 곳 바깥에 저장하게 된다. - 벗어난 데이터는 인접 메모리를 덮어쓰게 되어 프로그램 변수와 흐름 제어 데이터가 손상될 수도 있다. - 잘못된 ..
x86과 x64 레지스터는 보통 운영체제 윈도우의 패키지를 나타낼 때 자주 쓰여 익숙할 것이다. x64는 64비트, x86은 32비트를 의미하며, 두 레지스터의 차이와 구분 방법에 대해 알아본다. [x86과 x64의 차이점] x86(32bit), x64(x86-64/64bit) 1. 레지스터의 처리값 CPU는 I/O 버스를 통해 데이터를 내/외부로 전송한다. 이때 32bit를 지원하는 CPU라면 한 번에 전송하는 데이터의 양이 32bit=1word이며, 64bit를 지원한다면 1word는 64bit가 된다. 2. RAM에서 표현할 수 있는 주소값. 윈도우가 시스템에 장착된 메모리를 사용하기 위해서는 모든 메모리 공간에 대한 주소 정보가 필요하다. 정확한 주소가 있어야만 원하는 위치에 제대로 접근할 수 있..
[아키텍처(Architecture)] 아키텍처는 시스템의 물리적 또는 기능적 구조를 말한다. 즉, 서비스의 동작 원리를 나타내는 것. 이 포스트에서는 CPU/마이크로 아키텍처에 대해 다룬다. 아키텍처의 설계 과정에는 정책의 변화, 인력 문제 등의 내부 요인 뿐만 아니라 유저의 행동 경향, 소프트웨어의 동향 및 업데이트 현황 등 외부 요인까지 종합적으로 고려해 다양한 변수에 대응할 수 있도록 하는 것이 특징이다. [마이크로 아키텍처(Micro Architecture)] CPU 아키텍처는 핵심적으로 CPU 내에 탑제될 코어들의 위치 또는 캐시메모리 등의 구송요소 배치를 하기 위한 밑바탕이다. 즉, 납땜이 이루어지는 트랜지스터 간의 간격이나, 프로세서 내부의 각 트랜지스터 개수가 늘어나고 CPU 자체의 크기를..
[GCC의 개념] GCC는 GNU 컴파일러 모음(GNU Compiler Collection)의 약자이다. GNU 프로젝트의 일환으로 개발되어 널리 쓰이고 있는 오픈소스 컴파일러이다. 유닉스/리눅스 계열 플랫폼의 표준(사실상) 컴파일러라고도 볼 수 있다. 더보기 GNU: GNU's not UNIX, 리처드 스톨먼이 각종 자유 소프트웨어들이 작동되고 널리 퍼질 수 있는 생태계를 구축하기 위해 시작한 프로젝트이다. GCC에는 C, C++, Objective-C, Fortran, Ada, Go, D, libstdc++와 같은 라이브러리 언어 등이 포함되어 있다. Minimallist GNU for Windows, 윈도우용 포크. 여러 오픈 소스 프로그램들을 윈도우에서 돌아가게 하는 데 일조한다. MinGW는 M..
DLL이란? Dynamic Link Library, 동적 링크라고 하며, 실행 파일에서 해당 라이브러리 기능을 사용할 때에만 라이브러리 파일을 참조하여(or 다운로드) 기능을 호출한다. 정적 링크와는 다르게 컴파일 시점에 실행 파일에 함수를 복사하지 않고, 함수의 위치정보만 갖고 해당 함수를 호출할 수 있게 한다. 정적 링크* 더보기 Static Link Library(스태틱 링크, 정적 링크): 컴파일 시점에 라이브러리가 링커에 의해 연결되어 실행 파일의 일부분이 된다. - 리소스를 적게 사용한다. : 한 코드를 여러 프로그램이 동시에 사용하기 때문에 메모리가 절약된다. : 사용되는 디스크 공간을 줄일 수 있다.(정적 링크를 사용할 경우 실행 파일의 크기가 커진다) ㄴ 운영 체제와 프로그램이 더 빠르게..
어셈블리 핸드레이란? 어셈블리어를 C언어로 복원시키는 작업을 의미한다. 일반적으로 바이너리를 디버거로 열어보게 되면 바이너리에 대한 어셈블리 코드가 나온다. 이 어셈블리 코드를 그나마 익숙한 C언어 등의 언어로 변환하는 작업이 필요한데, 보통은 IDA의 헥스레이 기능을 사용하나, 완벽한 변환은 지원하지 않으므로 어셈블리 핸드레이에 익숙해져야 한다. 즉, 핸드레이를 하는 과정 자체가 어셈블리 코드를 C언어 등으로 변환하는 작업이기 대문에 변환 과정에서 코드가 어떤 의미를 하는지에 대한 이해는 필수적이다. [핸드레이 TIP] 1. EBP와 ESP를 통한 참조 컴파일러마다 다르기는 하지만 일반적으로 스택에서 전달인자나 변수를 할당할 때 ebp를 기준점으로 잡고 접근하는 경우가 많다. 2. EBP+8 이상의 값..
메모리란? 작업을 처리하기 위한 기억장치로 물리메모리(RAM), 가상 메모리(SDD, HDD의 swap)이 존재한다. - CPU는 작업을 수행할 때 메인 메모리까지 참조 가능하다. - 각 프로세스는 자신만의 메모리를 할당 받고, 메모리를 사용하여 동작을 수행한다. 더보기 가상 메모리: 필요한 내용만 물리 메모리에 올려 메모리를 관리하는 기법, 요구 페이징 기법을 사용한다. +) 가상 메모리에는 방어적 코드를 포함한 불필요한 코드가 올라간다. 요구 페이징 기법: valid, invalid(유, 무효 비트)로 페이지가 메모리에 존재하는지 확인, 없으면 보조 저장 장치에서 가져온다. 메모리 구조 코드 영역(Text) : 절대 변경되면 안되는 데이터가 저장된다. : 명령문을 포함한 코드에 직접적으로 적혀있는 문..
[어셈블리어(Assembly Language)] 어셈블리어란 프로그래밍 언어 중 하나로, 기계어와 함께 저급언어(Low-level Langauge)에 속한다. 0과 1로만 이루어진 기계어는 인간의 관점에서 이해하고 다루기 매우 어렵기 때문에 이를 보안하기 위해 개발되었으며, 기계어와 1대1로 대응한다는 특징이 있다. 고급언어와 마찬가지로 컴퓨터가 이해할 수 있도록 번역하는 과정을 거친다는 점에서 고급 언어와 기계어 사이에 있는 '중간 언어'라 불리기도 한다. 어셈블리어가 어렵다고 평가되는 것 중 하나가 CPU가 채택한 명령어셋(ISA)에 따르는 기계어와 1대1 대응을 하기 때문에 어셈블리어 역시 표준 규격화가 되어있지 않다는 것이다. 그 말인 즉슨, 문법 아키텍처와 CPU 아키텍처에 따라, 그리고 어셈블..
[아키텍처(Architecture)] 아키텍처는 시스템의 물리적 또는 기능적 구조를 말한다. 즉, 서비스의 동작 원리를 나타내는 것. 대표적으로는 하드웨어 아키텍처와 소프트웨어 아키텍처가 있으며, 아키텍처를 설계하고 관리하는 사람을 아키텍트(Architect)라고 한다. 아키텍처는 과거 다른 의미로 사용되었지만, 오늘날에는 첨단 정보기술을 이용한 정보체계, 소프트웨어 내장형 체계, 지휘 통제 통신체계 등을 구축하는데 적용되고 있다. 특히, 컴퓨터나 네트워크에서의 아키텍처는 프로세스, 전체적인 구조와 논리적 요소들, 그리고 컴퓨터와 운영체계, 네트워크 및 다른 개념 간의 논리적 상호 관계 등을 정의하는 모든 곳에 적용되는 용어라고 할 수 있다. [아키텍처의 특징] 아키텍처는 요구하는 것과 구현하는 것 사이..
프로그래밍 언어(Programming Language) 프로그래밍 언어는 컴퓨터에게 명령이나 연산 등 사람이 원하는 작업을 컴퓨터가 수행할 수 있도록 기계와의 의사소통을 지원해주는 언어이다. 즉, 컴퓨터에게 일을 시키기 위한 언어라고 볼 수 있다. 정해진 규칙에 따라 작업을 처리하고, 자료나 프로그램의 복잡한 구조를 구현할 수 있다는 특징이 있다. 또한, 시간의 흐름에 따라 활용이나 개념 등이 바뀔 수 있어 가변적이다. 프로그래밍 언어의 분류 프로그래밍 언어는 크게 저급 언어와 고급 언어 두 가지로 나눌 수 있다. 분류 기준은 보통 '컴퓨터와 인간의 언어 중 어디에 더 근접한가'이고, 컴퓨터가 쓰는 '기계어'에 가까우면 '저급언어', 인간이 쓰는 '자연어'에 가까우면 고급언어이다. 컴퓨터는 기본적으로 기..