어셈블리어 컴퓨터의 기계어와 치환되는 언어, CPU에서 사용되는 ISA의 종류가 다양한데 이 종류만큼 많은 수의 어셈블리어가 존재한다. X64 어셈블리 언어 기본 구조: 명령어(Operation Code, Opcode, 동사에 해당함), 피연산자(Operand, 목적어에 해당함) 피연산자 피연산자에서 올 수 있는 3가지 -상수(lmmediate Value) -레지스터(Register) -메모리(Memory): []으로 둘러싸여 표현, 앞에 크기 지정자 TYPE PTR이 추가될 수 있음(TYPE에는 BYTE, WORD, DWORD, QWORD가 올 수 있고 각 1,2,4,8, 바이트의 크기를 지정한다. -ex)메모리 피연산자의 예 메모리 피연산자 QWORD PTR [0x8048000] 0x8048000의 ..
컴퓨터 구조란? 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고 이들을 구성하는 방법 명령어집합구조 CPU의 명령어에 대한 설계 ->arm, mips,avr,인텔의 x86 및 x86-64 등 마이크로아키텍처 cpu의 하드웨어적 설계 연산과 제어를 위해 중앙처리장치(CPU)를, 저장을 위해 기억장치 사용, 장치간에 데이터나 제어신호를 교환할 수 있도록 버스라는 전다 통로 사용 중앙 처리 장치 프로그램의 연산을 처리하고 시스템을 관리하는 역할 -프로세스 코드 불러오고, 실행, 결과를 저장 -산술논리장치 + 제어장치 + 레지스터 기억장치 컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용 주기억장치와 보조기억장치로 분류 주기억 장치 - 프로그램 실행 과정에서 필요한 데이..
Stage2 요약 컴퓨터(CPU + 메모리) CPU: 명령어와 명령어 처리에 필요한 데이터를 메모리에서 읽고 ISA로 처리, 연산의 결과를 다시 메모리 적재 CPU와 메모리사이 연관이 있음 -> 메모리를 악의적으로 조작할 수 있다면 조작된 메모리 값에 의해 CPU도 잘못 동작(메모리 오염) 리눅스에서는 프로세스의 메모리를 위 사진처럼 크게 5가지로 구분 -> 운영체제가 메모리를 용도별로 나누면 각 용도에 맞게 적절한 권한을 부여할 수 있는 장점이 있음. (CPU는 메모리에 대해 권한이 부여된 행위만 할 수 있음) 코드 세그먼트 : 텍스트 세그먼트라고도 하며 실행 가능한 기계 코드가 위치하는 영역(코드 저장소) (읽기 권한과 실행 권한이 부여, 쓰기 권한이 있으면 악의적인 코드 삽입이 쉬워지므로 현대 운영..
File Download Vulnerability란? 파일 다운로드 기능이 존재하는 웹에서 파일 다운로드 시 파일의 경로 및 파일명을 파라미터로 받아 처리하는 경우 이를 적절히 필터링 하지 않으면 공격자가 이를 조작하여 허용되지 않은 파일을 다운 받을 수 있는 취약점(다운로드 대상 파일이 위치한 디렉토리를 벗어나 다른 경로에 있는 파일까지 접근 가능하게 하는 취약점 )이다. 즉, 다른 경로에 파일까지 접근 가능한 것을 말한다. 상대 경로와 절대 경로 파일 다운로드는 절대 경로를 이용하거나 상대경로를 이용하는 2가지 방식 존재한다. 상대 경로: 현재 위치한 곳을 기준으로 하여 그곳의 위치 ex) www.test.com/files/download.php path=/files/binary&filename=do..
왜 도커를 써야하는 지에 대한 의문 컨테이너는 대충 말하면 애플리케이션 환경에 구애 받지 않고 실행하는 기술. 컨테이너 도구인 도커가 설치되어 있으면 어느 환경이든 상관없이 명령어를 사용하여 실행 가능 서버를 코드로 구성하고 관리하는 방법으로써 도커가 지닌 장점 실행 시점에 상관없이 구성 시점을 고정할 수 있는 도커 도커가 다른 서버 구성 도구와 구별되는 점임 다른 도구들은 모두 도구를 실행하는 시점에서 서버의 상태가 결정 도커는 작업자가 그 시점을 미리 정해둘 수 있음 그래서 서버를 항상 똑같은 상태로 만들 수 있다. 서버를 구축할 때 서버마다 운영체제, 컴파일러, 패키지 등의 차이가 발생하게 된다. 만약 새로 서버를 구축한다고 할 때, 기존 서버에 대한 지식을 가진 사람이 없다면 문제가 발생하게 된다..
먼저 crakme4를 실행해보았다. 다음 줄에서 실행이 시작된다. 아무 구문을 입력했을 때는 fail이라는 구문이 뜨게 되고 F8을 통해 실행 창이 뜨는 부분에 들어가보기로 했다. 아래 줄(00401481)을 지나가게 될 때 값을 입력해주라고 뜬다. 값을 입력해주고 파란줄 아랫줄인 00401120까지 들어가본다. 타고 타고 쭉 들어가보면 이 부분에서 글자 길이수를 알 수 있었다. (( esi와 eax를 비교하여 결과에 따라 je 함수가 실행하게 된다고 나와있다.)) 오른쪽 레지스터 값을 보게되면 아래와 같이 나온다. 먼저 eax가 내가 입력한 값의 글자수라는 걸 알수 있었다. (계속 풀다보니 입력한 값의 글자수가 eax에 보이는 것을 알 수 있었음) esi의 값은 계속 7이라는 것을 알 수 있었고 eax..
crackme3 crakcme3을 올리디버그를 통해 열어보았다. crackme3의 첫화면이고 항상 그랬듯 먼저 F9를 통해 전체 실행을 먼저 해보았다. F9 실행시 crackme2와 같은 메세지창이 떴고, key값이 아닌 다른 값을 입력했을 때 Wrong word!!! 가 뜨는 것을 확인할 수 있었다. 이 부분을 지나가면 아스키코드 값에 해당 문구가 뜨는데 전에 crackme 풀이를 했을 때 처럼 키워드인 것 같아 하나씩 넣어보았다. infinity를 입력했을 때 maximin 값이 뜨는 것을 확인할 수 있었다. 그치만 정석 풀이가 아니므로 다시 한번 시도해본다. 먼저 f8로 한줄씩 내려가 먼저 실행이 되는 부분에 들어가보았다. 먼저 무한루프가 있는 곳을 확인하고 계속 쭉 내려가다 보니 익숙한 GetDi..
crackme2 crackme2 실행 파일을 올리디버그를 통해 확인해보았다. 먼저, crackme1과 같은 방식으로 파일을 F8로 한줄 실행을 해보았고 0040149B 에서 메세지 박스를 출력하는 것을 알 수 있었다. 그리고 출력되는 메세지 박스의 OK와 exit 버튼을 눌렀을 때 아무런 변화가 없는 것을 확인했다. 메세지 박스가 뜨는 0040149B에 어셈블리어 call CrackMe2.00401000를 확인하고, 00401000부터 차례대로 읽어보기로 했다. 00401000부터 쭉 읽어내리다 보니 위에서는 볼 수 없었던 ASCII코드 값 "HackFun"이 보였고 아스키코드 값인 HackFun 값을 입력했을 때 SEP 값이 뜨는 것을 확인할 수 있었다. 너무 표면적으로 보이는 답이라 얻어 걸린 듯하지..
BOF(Buffer Overflow) 연속된 메모리 공간을 사용하는 프로그램에서 할당된 메모리의 범위를 넘어선 위치에 자료를 읽거나 쓰려고 할 때 발생하는 취약점으로 스택이 꽉차게 되면 RET값을 변조해서 공격하는 방법이 가장 흔하게 쓰인다. 즉, 한정된 용량의 버퍼로 인해 프로그램 에러를 유발 시키도록 하는 건데 프로세스 메모리 상에 지정된 버퍼를 초과하는 입력 값을 발생시키는 stack overflow, 원래 프로그램이 가르키고 있는 포인터 영역을 바꿔서 공격하는 heap overflow가 있다. 종류 (stack에 존재하는 buffer에 대한 공격이냐, heap에 존재하는 buffer에 대한 공격이냐에 따라 구분 ) Stack Buffer Overflow 스택(함수 처리를 위해 지역 및 매개변수가 ..
레지스터란 CPU가 요청을 처리하는데 필요한 데이터를 일시적으로 저장하는 기억장치이다. 컴퓨터에서 데이터를 영구적으로 저장하기 위해서는 하드디스크를 이용해야하고, 임시적으로 저장하는 장소를 메모리(RAM)이라고 한다. 여기서, 메모리로 연산의 결과를 보내고 영구적으로 저장할 데이터를 하드디스크에 저장해야하는 등 명령을 처리하기 위해서는 이들에 대한 주소와 명령의 종류를 저장할 수 있는 기억 공간이 하나 더 필요한데 이 공간은 무리 없이 명령을 수행하기 위해 메모리보다 빨라야한다. 바로 이 역할을 하는 것이 cpu 옆에 붙어 있는 레지스터다. 레지스터는 공간은 작지만 CPU와 연결되어 있으므로 연산 속도가 메모리보다 실제 수십배에서 수백배까지 빠르다. x86 시스템의 레지스터 종류 x86 아키텍쳐는 8개의..