ALL 61

#3 Protected Mode

이전 포스트까지는 16비트로 돌아가는 리얼모드에서 구동했지만, 이제부터는 32비트의 보호모드에서 운영체제를 구동시켜보도록 한다. 리얼모드는 PC가 부팅할 때, 맨 처음에 동작하는 CPU의 모드로 16비트로 동작한다. 때문에 모든 레지스터가 16비트로 구동됨. 레지스터는 모두 16비트의 한 개의 WORD로 이루어짐, 즉 한번에 0xFFFF 까지밖에 저장이 불가. 1. 인텔 CPU에서는 세그먼트 오프셋 방식을 사용하여 주소에 접근하는데, 리얼모드에서는 두 레지스터를 사용해도 16비트씩밖에 사용을 못하기 때문에 오프셋이 정해진다면 해당 오프셋:0xFFFF 까지 밖에 접근을 못한다. -> 즉, 해당 오프셋 바깥의 주소에는 접근이 불가하며, 접근을 위해서는 FAR JMP를 실행해야 함. 2. 리얼모드에서 동작하는..

[asm] INT 21H

#시작하기 전에, 왜 기존에 썼던게 날아갔는지 모르겠어요. 오프로 정리해뒀던 문서까지 날아가서 멘탈 조금 깨질 것 같네요 야호 어셈블리도 다른 언어들이 함수를 미리 선언한 후 사용하는 것처럼 인터럽트를 사용하여 정의한 함수를 호출할 수 있다. INT 21H는 MS-DOS API로, MS-DOS 및 기타 도스 호환 운영 체제에 쓰이는 API이다.도스 API의 대부분은 INT 21H를 통해 호출할 수 있다. 해당 도스 서비스에는 키보드 입력, 비디오 출력, 디스크 파일 접근, 프로그램 실행, 메모리 할당 등이 있다. 도스에 쓰이는 다른 인터럽트 벡터는 다음과 같다. 인터럽트 내용 20h 프로그램 끝내기 21h 주요 DOS API 22h 프로그램 끝내기 주소 23h Ctrl-C 핸들러 주소 24h 심각한 오류..

Computer 2019.10.01

FTZ: Level 8

Level 8로 로그인해서 hint 파일을 열어보면 다음과 같은 힌트를 얻을 수 있다. 용량이 정확하게 2700인 파일은 많지 않을것이라 생각하고, find 명령어와 옵션을 이용해서 이 파일을 찾아보도록 하자. 다음과 같이 find / -size 2700c 2> /dev/null 명령어를 사용하면 다음 옵션들이 조합되어 실행된다 1. 루트에서부터 2. 사이즈가 2700c(= 2700바이트)인 파일을 찾는다 3. 표준 에러일 경우(2>) 4. 화면이 아닌 /dev/null 에 저장한다 결과는 다음과 같이 /etc/rc.d/found.txt라는 파일을 찾을 수 있었다. 해당 파일을 열어보면 다음과 같이 shadow 형태의 내용이 들어있는 것을 알 수 있다. shadow 파일은 /etc/passwd에서 암호화..

Write-Up/FTZ 2019.09.26

FTZ: Level 7

** wrong.txt 에러 관련 ...더보기 , FTZ 문제를 풀다 보면 level7에서 wrong.txt 파일이 존재하지 않는다는 에러를 볼 수 있다. 원래 아래와 같은 내용이 포함되어있어야 하며 직접 root 권한으로 해당 위치에 wrong.txt 파일을 작성해도 되고, 그냥 아래 내용을 참고해도 된다. 올바르지 않은 패스워드 입니다. 패스워드는 가까운곳에... --_--_- --____- ---_-__ --__-_- level 7에 로그인하여 바로 힌트를 확인하면 다음과 같은 내용이 적혀있다. 바로 /bin/level7 명령을 실행하면 다음과 같이 패스워드를 입력하라는 문구가 뜬다. 우리는 아직 비밀번호에 대한 어떠한 정보도 없으니 아무 값이나 입력하면 비밀번호에 대한 정보가 출력된다. * 원래 ..

Write-Up/FTZ 2019.09.26

FTZ: Level6

레벨 6는 로그인하자마자 힌트가 출력된다. 그 상태에서 아무 키나 누르면 BBS 연결 메뉴로 진입하게 되는데, 이 메뉴로 진입하게 되면 어떤 키를 누르던 연결이 끊긴다. (ctrl+c는 막혀 있음) 그렇다면, 힌트가 출력되는 부분은 어떨까? ctrl+c가 막혀있지 않아 실행중이던 프로그램을 취소하고 level6의 쉘로 돌아가게 된다. level6의 홈디렉토리에는 password라는 파일이 있었는데, 이 파일은 권한이 level6로 되어있어 별다른 작업 없이 바로 파일을 열어볼 수 있다.

Write-Up/FTZ 2019.09.26

GDB 실습하면서 정리하는 명령어

GDB 실행 : gdb [파일 이름] gdb -q [파일 이름] : gdb 버전 정보에 대한 출력이 없어짐 gdb --args [파일 이름] [arguments~~] : 파일 실행 시, 인자값을 전달할 수 있음. q, quit : gdb 프로그램 종료 disassemble, disas [함수명] : 해당 함수 부분에 대해 disassemble 진행 * gdb의 기본 출력은 AT&T asm 문법을 따른다. intel 문법으로 확인하고 싶으면 다음 명령어를 입력하면 된다. * set disassembly-flavor intel b, break *[주소값] : 해당 주소에 브레이크 포인트를 설정한다. 함수명을 주소값 대신 설정 가능하다. 이 때는 *를 달지 않는다. break [주소값] [조건문] : 주소값에..

Computer 2019.09.25

메모리 구조

프로그램이 실행되기 전에 먼저 메모리에 로드되어야 한다. 그리고 프로그램 내에서 사용할 많은 변수들을 저장할 공간도 필요하다. 운영체제는 프로그램을 실행하기 위해 많은 메모리 공간을 제공하는데, 대표적으로 다음과 같다. 코드 영역 실행할 프로그램의 코드 데이터 영역 전역 변수 정적 변수 힙 영역 사용자의 동적 할당 스택 영역 지역변수 매개변수 코드 영역에 가까울 수록 낮은 주소이고, 스택 영역에 가까울수록 높은 주소를 갖게 된다. 힙 영역과 스택 영역은 고정되어있지 않는데, 스택 영역은 컴파일 타임에 따라, 힙 영역은 런 타임에 따라 크기가 결정된다. 같은 영역을 공유하게 되는 만큼 어느 한쪽이 과도하게 메모리를 많이 쓰게 된다면 각각 스택 오버플로우, 힙 오버플로우가 발생하게 된다. 코드 영역 - 프로..

Computer 2019.09.24

Register - 간단 개념 정리

운영체제 개발이든, 리버싱이든 여러 작업을 하다 보면 제일 많이 접하게 되는 부분이 레지스터이다. 레지스터는 CPU에서 요청을 처리하는데 필요한 데이터를 임시로 저장하는 기억장치이다. RAM과는 달리, 명령을 처리하기 위한 주소들과 명령의 종류를 저장하는 추가적인 기억장치가 레지스터인데, 바로바로 사용되어야 한다는 부분에서 레지스터는 RAM보다 읽어오는, 그리고 메모리를 쓰는 속도가 빠르다. 이는 레지스터 자체 능력도 있지만, CPU와 직접 연결이 되어있기 때문에 메모리보다 훨씬 빠른 속도를 낼 수 있다. 레지스터에는 여러 종류가 있는데, 우선 비트 단위에 따라 구분할 수 있다. RAX (64비트) EAX (32비트) AX (16비트) AH (8비트) AL 32비트 레지스터와 64비트 레지스터는 크기에 ..

Computer 2019.09.23