일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- >
- linux
- BEST of the BEST
- vim
- #Qt Creator
- #MINT64 #Sqix
- Network
- 오버워치
- 오버워치 세이버메트릭스
- libpcap
- vi
- command
- Sqix
- ftz
- #
- KASAN
- libtins
- Overwatch League SaberMetrics
- FTZ 레벨2
- #IntelManual #segment Descriptor #세그먼트 디스크립터 #MINT64 #Sqix
- vi 외부 명령어
- #Best of the Best #OS #MINT64 #Sqix
- #IntelManual
- Find
- C++11
- 인터럽트
- Today
- Total
목록분류 전체보기 (76)
Sqix
깨진 한글 부분만 따로 검색했습니다. 다음 코드는 autodig의 소스코드이다. /* 소스 코드 */ 이를 이용하여 level4의 권한을 얻어라. more hints. - 동시에 여러 명령어를 사용하려면?- 문자열 형태로 명령어를 전달하려면? 문자열 형태로 명령어를 전달하려면, " "를 달아주어 파라미터로 전달하면 됩니다. 또한, 동시에 여러 명령어를 사용하려면 ; (앞의 명령어의 성공 유무와 상관없이 실행), & (앞의 명령어가 성공하면 실행), && (명령 동시에 실행. 앞의 명령은 백그라운드로 실행됨)을 씁니다. 코드를 대충 둘러봐도 위험한 요소가 몇 개 보이네요. strcpy, strcat 함수를 사용했는데, 해당 함수는 memory boundary 검사를 안 해서 BOF 취약점이 발생하는 함수입..
FTZ level2로 진입합니다. hint는 "텍스트 파일 편집 중 쉘의 명령을 실행시킬 수 있다는데..." 입니다. 아무래도 기본적으로 설치되어 있는 텍스트 에디터는 vi일 테니, vi 관련 문제인 듯 합니다. vi에서 외부 명령어를 사용하는 방법으로는, 두 가지가 있습니다. vi를 실행하고 esc를 눌러서 명령어를 실행시킬 수 있도록 합니다. 쉘 실행 :sh vi로 돌아오기 ctrl + d vi에서 명령어 실행 :! {commands} 실행 명령어의 결과 가져오기 :r!ls -al level2 계정으로 로그인을 해서, level3으로 setuid가 걸린 파일이 있나 찾아보았습니다. /usr/bin에 있어서 찾아보았습니다. 실행 권한까지 있네요. 열어 보니, vim editor를 그냥 실행하면 ($ v..
Level 1번 문제를 풀기 위해 ssh로 진입합니다. ls 명령어를 이용해 어떤 파일이 있는지를 체크해 봅니다. hint가 있으니 hint를 보도록 합시다. 한글이 깨져서 나오는데, 인코딩 문제로 보여서 힌트는 따로 찾아보았습니다. 힌트는 다음과 같습니다. level2 권한에 setuid가 걸린 파일을 찾는다. 처음에 삽질을 하다가 find의 -perm옵션을 이용한다면 손쉽게 찾을 수 있다는 것을 알아냈습니다. 이에 대해서는 따로 정리를 해 두었습니다. setuid는 특수 권한으로, root 권한에서만 접근할 수 있는 파일 혹은 커맨드에 대해서 일반 user가 사용할 수 있도록 하는 권한입니다. 이는 permission을 나타내는, 예를 들어 755와 같은 숫자들 앞에 특수 권한을 나타내는 비트를 추가..
FTZ를 풀다가 리눅스 명령어에 대해서도 정리를 한 번 해 볼 필요가 있는 것 같아서 해당 카테고리를 만들었습니다. FTZ 1번을 풀기 위해서는 리눅스 명령어 find에 대한 지식이 필요합니다. 정확히는 특정 권한을 가진 파일을 찾기 위한 -perm 옵션과 1>, 2>와 같은 STDOUT, STDERR을 이용한 불필요한 스트림을 없애는 것이 핵심입니다. find 명령어는 rule of precedence(우선순위 규칙)에 따라서 주어진 expressions를 이용해 루트 디렉토리 트리를 검사하여 결과를 알려주는 명령어입니다. 기본적으로 파일, 디렉토리를 검색할 수 있고 find . -name "filename" -exec sh -c "parameter" 와 같은 형식으로 파일을 찾아 바로 실행하는 등의 ..
이제 우리는 보호 모드에서 사용할 코드를 작성해야 합니다. 16비트의 레지스터를 32비트로 변경해 주고, 스택 크기 역시 4바이트로 크기가 증가하였기 때문에 파라미터들에 대한 오프셋 역시 +4n으로, 즉 4의 배수로 늘려주어야 합니다. 이전에 플래그 부분에서 언급했던 내용이기도 하지만, 32비트 오프셋을 이용하기 때문에 우리는 4GB의 메모리 영역에 마음껏 접근할 수 있기 때문에, 비디오 메모리를 접근할 때 굳이 ES 레지스터를 사용할 필요가 없기도 합니다. 지금까지 우리가 한 과정을 Linux Boot Protocol을 기준삼아서 정리해 보겠습니다. 부트 로더를 이용해서 코드 영역, 데이터 영역, 스택 영역을 설정 및 초기화해 주고, 16비트 커널 이미지를 로드하여 주었습니다. 이제 우리가 할 일은 3..
이 글은 16비트에서 32비트로 전환하는 과정에 대해 다룹니다. 보호 모드로 동작하는 경우, 모든 메모리 엑세스는 GDT 혹은 optional LDT를 거쳐가게 됩니다. 여기서 GDT란, Global Descriptor Table의 약자입니다. GDT는 세그먼트의 크기, 베이스 주소, 권한 등을 담은 테이블입니다. GDT에 대한 정보는 CPU 내의 GDTR 레지스터에 세그먼트 디스크립터로 저장됩니다. LDT는 GDT와 같이 디스크립터를 포함하는 테이블입니다. 이는 GDT에 포함 가능한 디스크립터가 8192개로 경우에 따라 디스크립터가 모자랄 수 있기 때문에 만들어진 테이블입니다. 이 테이블은 이전 글에서 언급되었던 세그먼트 디스크립터를 가지고 있습니다. 세그먼트 디스크립터는 세그먼트의 Base Addre..
이 글은 세그먼트 디스크립터에 대해서 다룹니다. 16비트에서 32비트 모드로 전환하기 위해서는 프로세서에서 참조하는 GDT와 세그먼트 디스크립터라는 자료구조를 생성하고, 프로세서에 이를 설정하여야 합니다. 32비트 모드로 전환하기 위해서는 다음과 같은 과정을 거칩니다. (출처 : http://getchabug.blogspot.kr/2016/02/64-bit-os-production-01switch-to-32bit.html) 전환 과정은 위 그림과 같습니다. 우선, 두 자료구조인 세그먼트 디스크립터와 GDT를 생성합니다. 그 후, GDTR에 GDT Start Addr, GDT Size를 설정합니다. 32비트로 전환하기에, CR0 Register의 PE 비트를 1로 세팅하고, PG 비트를 0으로 세팅하여 3..
32비트 커널에 대해 공부하기 이전에, 잠시 제가 사용하는 IDE를 소개해 드리고자 이 글을 작성하게 되었습니다. 저는 Linux(정확히는 Ubuntu 16.04 LTS)에서 개발을 할 때에는 두 가지 에디터를 사용합니다. Exploit Code를 작성하기 위해 Python 혹은 C를 사용할 때는 Vim 에디터를 사용하고, C++를 개발할 때에는 Qt Creator IDE를 사용하고 있습니다. (아직 모던 C++는 자세히 공부하지 않아서, C++11을 사용하고 있습니다) Qt에는 Qt Application을 위한 방대한 라이브러리가 있습니다. 라이브러리 앞에 Q를 붙여 일반 라이브러리와 구분하고 있습니다. 따로 이 문서를 작성하는 이유는, asm 파일과 makefile, .bin 파일, .img 파일들이..
부트 로더를 만들었으니 테스트를 해야 합니다. OS 이미지가 전부 로드가 되는지 알아야 하기에, 충분한 크기의 테스트 이미지가 필요합니다. 부트로더에서 로드할 OS 이미지가 1024 섹터 (512b * 1024 == 512KB)를 가지기 때문에 해당 크기를 갖는 가상 OS 이미지를 제작하여 테스트할 것입니다. 이미지가 너무 커서, 직접 손으로 전부 작성하는 것은 사실상 불가능한 일이고, 코드를 생성하고 이를 반복하여 삽입하는 것으로 섹터를 만들어 보도록 합시다. 레지스터를 초기화한 뒤 0을 출력하도록 하고, 정상적으로 해당 섹터가 수행되면 SECTORCOUNT에 기록합니다. 이렇게 한 번의 동작 코드를 만든 후, 전처리기를 이용하여 1024번 반복하도록 하면, 1024의 섹터를 가지는 OS 가상 이미지가..
※ 저번 주 공군 면접과 RCTF, 제 1회 KYSIS 해커톤 참여를 하게 된 관계로 포스팅이 늦어졌습니다. 죄송합니다. 이 글은 x86 architecture의 함수 호출 규약에 대해 다룹니다. 함수 호출 규약은 서브루틴이 caller에게서 변수를 받거나 반환하는지에 대해서 규약을 지정한 것입니다. 각 아키텍쳐마다 사용하는 호출 규약이 다릅니다. 우리는 x86 아키텍쳐에서 OS를 개발하고 있기 때문에, 이에 맞는 호출 규약에 대해서 다루고자 합니다. 우리가 호출 규약에 대해서 알기 위해서는 먼저 호출자(Caller)와 피호출자(Callee)에 대해서 알아야 합니다. 간단합니다. 프로그램 실행 흐름에서, 호출하는 함수를 Caller라고 부르고 호출당하는 함수를 Callee라고 부릅니다. 예를 들어 보겠습..