linux wildcard 컴퓨너에서 특정 명령어로 명령을 내릴 때, 여러 파일을 한꺼번에 지정할 목적으로 사용하는 문자열 기호를 가라킨다. 리눅스는 c언어로 작성되어있는데, 와일드카드 기능은 c언어의 연산자와 매우 유사하다. unix에서부터 사용되어 왔으며 unix 계열(unix_like)에선 모두 사용할 수 있다. 와일드 카드는 따옴표(" ") 안에 넣으면 안 된다. * 일치 되는 모든 "문자열" 을 찾아주는 명령어 // ls 예시 $ ls * // 현재 디렉토리에 있는 모든 파일 list 출력 $ ls *.c // 현재 디렉토리에 있는 .c 파일 list 출력 $ ls ma* // ma으로 시작하는 현재 디렉토리에 있는 모든 파일 출력 $ ls *aba* // aba가 들어있는 현재 디렉토리에 있는..
OS injection 시스템 명령어를 쿼리문에 주입하여 취약한 변수를 통해 서버 운영체제에 접근하는 공격 웹 (애플리케이션)이 구동 중인 서버의 운영체제상에서 임의의 명령을 실행하도록 하는 웹 취약점 -OS command injection 또는 shell injection이라고도 함 -OS(operating system) 운영체제: 사용자의 하드웨어, 시스템 리소스를 제어하고 프로그램에 대한 일반적인 서비스를 지원하는 시스템 소프트웨어( 사용자 -> 응용프로그램 -> 운영체제 -> 하드웨어 ) -OS는 수많은 application이 잘 동작할 수 있도록 자원(리소스)를 할당하고 관리, 하드웨어와 소프트웨어를 하나로 묶어주는 역할 -웹페이지에 시스템 명령어를 주입하여 쉘을 획득하는 공격 -OS 명령 인젝..
2023/03/13 crackme #1 먼저, crackme1 실행 파일을 올리디버그를 통해 확인해보았다. F9로 파일 전체 실행을 했을 때 두 개의 메세지 박스(Make me think your HD is a CD-Rom. , Nah, This is not a CD-ROM Drive! )가 뜨는 것을 확인할 수 있었다. 그래서 F8로 한줄씩 실행시켜보다 메세지 창을 뜨게해주는 줄을 찾게 되었다. 주소 00401036로, 어셈블리어를 확인해보니 CALL 이었다. 이 메세지 창을 뜨지 않고 종료를 해보면 될 것 같아, (마지막 종료 문자가 있는 exitprocess로) jmp 함수를 사용하여 종료되는 곳의 주소인 jmp 00401050으로 주소값을 변경해주었다. (두번 클릭) 00401036의 원래 있었던..
명령어 Data Transfer 명령어 설명 MOV Move 데이터 이동 (전송) PUSH Push 오퍼랜드의 내용에 스택을 쌓는다. POP Pop 스택으로부터 값을 뽑아낸다. XCHG Exchange Register / memory with Register 첫번째 오퍼랜드와 두번째 오버랜드 교환 IN Input from AL/AX to Fixed port 오퍼랜드로 지시된 포트로부터 AX에 데이터 입력 OUT Output from AL/AX to Fixed port 오퍼랜드가 지시한 포트로 AX의 데이터 출력 XLAT Translate byte to AL BX:AL이 지시한 데이블의 내용을 AL로 로드 LEA Load Effective Address to Register 메모리의 오프셋값을 레지스터로 ..
GCC(GNU Compiler Collection) 직역하면 GNU 컴파일러 모음으로, GNU 프로젝트의 일환으로 개발되어 널리 쓰이고 있는 컴파일러이다. 즉, 각종 프로그래밍 언어 소스를 컴파일 하기 위한 컴파일러 기능 제공 환경이다. 지원 프로그래밍 언어로 C, C++, Objective C, Fortran, Pascal, Ada, Java 등 GNU(GNU's not UNIX) 리처드 스톨먼이 각종 자유 소프트웨어들이 돌아가고 번영할 수 있는 생태계를 구축하기 위해 시작한 프로젝트 컴파일러 어떤 언어의 코드를 다른 언어로 바꿔주는 과정을 이야기한다. 즉 어떤 프로그래밍 언어로 쓰여진 소스 파일을 다른 언어로 바꾸어주는 번역기이다. 컴파일 과정 [ *.c -> (*.i) -> (*.s) -> (*.o..
DLL (Dynamic Link Library) 동적 링크 라이브러리로, 라이브러리라는 말에서도 알 수 있듯이 비슷하고 반복되는 로직, 함수를 따로 파일로 떼어내어 간편하게 재활용 하는 것이다. 그 중에서 컴파일 시점에 main 코드와 결합되지 않고, 프로그램을 실행하면 dll 파일을 필요할 때 호출한다. 그렇기에 실행파일과 dll파일은 독집적으로 존재한다고 볼 수 있다. DLL 활용 장점 • 더 적은 리소스 사용 여러 프로그램이 같은 함수 라이브러리를 사용하는 경우 dll을 사용하면 디스크와 실제 메모리에서 로드되는 중복 코드를 줄일 수 있다. • 손쉬운 배포와 설치 DLL 내의 함수를 업데이트하거나 수정해야하는 경우 DLL을 배포하고 설치할 때 프로그램을 DLL과 다시 연결하지 않아도 된다. 여러 프..
어셈블리 핸드레이 어셈블리어를 c언어로 복원시키는 것을 의미한다. 일반적으로 바이너리(0,1로 이루어진 이진법)를 디버거(프로그래밍 과정 중에 발생하는 오류나 비정상적인 연산을 찾아 수정하는 것)로 보게 되면 바이너리에 대한 어셈블리 코드가 나오게 된다. 이 어셈블리 코드는 명시적으로 알아보기 힘든데 그래서 사용자에게 익숙한 c언어로 변환하게 된다. 보통 IDA를 사용하면 IDA의 기능 중 하나인 헥스레이 기능을 이용해서 이 작업을 수행할 수 있게 된다. IDA 역시 완벽한 변환이 아니고 수작업을 통해 변환된 코드를 수정할 일이 필요하므로 어셈블리 핸드레이에 익숙해져야 한다. 그래서 기본적인 어셈블리 명령어들을 알아야한다. (게시글로 정리) 어셈블리어 명령어 정리 (tistory.com) 어셈블리어 명령..
컴퓨터 메모리(RAM)란? 시스템의 단기 데이터 스토리지로 정보에 빠르게 엑세스할 수 있도록 컴퓨터가 실시간으로 사용하는 정보를 저장하는 곳이다. 즉 작업을 처리하기 위한 기억장치로 cpu는 작업을 수행할 때 메인 메모리까지 참조 가능하다. 시스템에서 많은 프로그램을 실행할 수록 더 많은 메모리가 필요하게 된다. RAM은 저장된 데이터를 순차적이 아닌 임의의 순서로 엑세스할 수 있는 데이터 장소이다. ( 각 프로세스는 자신만의 메모리를 할당받고, 메모리를 사용하여 동작한다) 프로그램의 정보를 읽어 메모리에 로드되는 과정이다. 프로그램을 실행하게 되면(과정 2번) OS는 메모리(RAM)에 공간을 할당해준다. 할당해주는 메모리 공간은 4가지(Code, Data, Stack, Heap)가 있다. 코드 영역 작..
어셈블리어(assembly language) 또는 어셈블리 언어 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다. 전류가 흐르고 안 흐르고로 표현되는 0과 1의 이진수 기계어는 인간의 관점에서 컴퓨터가 바로 읽을 수 있다는 점을 빼면 장점이 없는 언어이기 때문에 이를 보완하기 위해 나온 언어가 어셈블리어이다. 기계어와 명령어가 1:1로 대응되는 단어들로 구성되어 있다. 컴퓨터 구조에 따라 사용하는 기계어가 달라지며, 따라서 기계어에 대응되어 만들어지는 어셈블리어도 각각 다르게 된다. 컴퓨터와 가까운 언어(저급어)이기 때문에 컴파일을 해도 간단한 명령어로 이루어져 있어서 실행 속도가 빠르지만 배우기가 어렵고 유지보수가 힘들다는 이유로 자주 사용되지 않고 있다. 하지만 임베디드 시스템이나 커널..
아키텍쳐(Architecture)란 컴퓨터 시스템의 구조(설계, 조직, 기능)에 대한 법칙과 방법을 통칭 즉, 하드웨어와 소프트웨어를 포함한 컴퓨터 시스템 전체의 설계 방식을 뜻한다. 컴퓨터 프로세스와, 전체적인 구조, 논리적 요소들, 컴퓨터와 운영체계 그리고 네트워크 등과 같은 개념들이 서로 논리적으로 상호작용하며 적용되는 모든 것을 이야기한다. 아키텍쳐 종류(cpu 명령 체계) • x86 인텔의 cpu 시리즈 이름이자 그 cpu의 명령체계 아키텍쳐의 이름이다. cpu의 내부 명령어를 처리하는 로직 아키텍쳐로 대부분의 컴퓨터 및 서버 하드웨어에서 사용되는 유형이다. 아키텍처 측면에서 메모리, 그래픽 카드 및 사운드 카드, cpu와 같은 x86 시스템 내의 하드웨어 구성 요소는 모두 서로 독립적이다. 하..
프로그래밍 언어 컴퓨터에게 일을 시키기 위한 언어, 컴퓨터에게 명령이나 연산과 같은 작업을 시키려면 사람과 컴퓨터가 의사소통(지시) 이 가능해야하므로 프로그래밍 언어로 처리 할 수 있도록 한다. 정해진 규칙에 따라 작업을 처리하고, 복잡한 구조를 구현할 수 있다. 프로그래밍 언어의 분류 기준 컴퓨터와 인간의 언어 중 어디에 근접한가를 기준으로 고급 언어, 저급 언어로 분류한다. 컴퓨터(기계어)에 가까울 수록 저급 언어, 사람이 쓰는 자연어에 가까울 수록 고급 언어이다. 컴퓨터(기계) 인간 저급 언어 고급언어 고급 언어(high-level language) •사람이 이해하기 쉽게 작성된 프로그래밍 언어로 사람 중심의 언어이다. •하드웨어 관련된 지식 없이도 프로그램 작성이 가능하다. •가독성이 높고 다루기..