전체 글 61

륳륳ㅅ

세그먼테이션 테이블 : 세그먼트의 크기를 나타내는 limit와 물리 메모리 상의 시작 주소를 나타내는 address가 있음 각 세그먼트가 자신에게 주어진 메모리 영역을 넘어가면 안 되기 때문에 세그먼트의 크기 정보에는 크기를 뜻하는 size 대신 제한을 뜻하는 limit 사용. 세그먼테이션 기법에서도 물리 메모리가 부족할 경우, 스왑 영역을 사용 크기가 100B인 프로세스 D가 스왑 영역이 있고, 세그먼테이션 테이블의 address에 I(invalid)라고 표시

카테고리 없음 2019.11.29

운영체제 13주차

가상메모리 관리 용량의 한계를 여유있게 쓰기 위해 가상메모리를 사용. 설명을 하셨죠 하드......의 일부를 잘라서 주기억장치 처럼 쓰는데 아무튼 주기억장치는 아님 모든 시스템은 가상메모리를 사용하는데 현재 있는 메모리가 용량이 매번 부족하기 때문이죠. OS에서 가상메모리 할당 공간을 늘릴 수 있음. 언제든 늘려서 쓸 수 있음. 가상 메모리 : 물리 메모리의 크기와 상관없이 프로세스에 커다란 메모리 공간을 제공하는 기술. 가상 메모리를 이용하면 프로세스는 운영체제가 어디에 있는지 물리 메모리의 크기가 어느 정도인지 신경 쓰지 않고 메모리를 마움대로 사용할 수 있다. 가상 메모리의 구성 - 크게 프로세스가 바라보는 메모리 영역과 메모리 관리자가 바라보는 메모리 영역으로 나뉨 - 가상 메모리에서 메모리 관리..

카테고리 없음 2019.11.29

LOB: succubus -> nightmare

1. nightmare.c 분석 - addr : strcpy()의 주소 - argv[1] : 사용자가 입력한 인자, 버퍼에 복사됨 - RET : buffer+44 => RTL 기법 이용, RET에 strcpy 주소를 넣어야 함 흐름을 살펴보면 마지막 memset() 함수를 이용하여 ret+4의 주소부터 4바이트를 A로 채운다. 이때 strcpy() 함수를 삽입시키면 버퍼의 문자열 전부를 RET+4부터 복사할 수 있다. => 버퍼에 RTL 기법을 이용하여 system() 함수로 쉘을 얻을 수 있다. 2. 디버깅 라이브러리에 저장된 system() 주소를 얻어온다. 어셈블에 있는 strcpy() 주소도 얻을 수 있다. 3. 페이로드 작성 페이로드는 다음과 같이 이뤄진다 system() + dummy + "/..

Write-Up/LOB 2019.11.28

LOB: troll->vampire

1. vampire.c 확인 두번의 if 구절을 피해야함. a. argv[1][47] == "\xbf" b. argv[1][46] != "\xff" 이에 맞게끔 주소를 할당해야 함. 다만 스택의 윗부분은 커널이 존재하므로 argv[2]를 이용하여 "0xbfff" 영역에서 벗어날 수 있도록 페이로드를 구상할 것. 2. 디버깅 - 어셈블러 분석 a. 함수의 프롤로그부분에 bp를 설정하고 ebp의 위치를 찾아 스택이 어디로 할당되었는지 확인한다. 확인해보면 스택이 0xbffe7478에 할당되어 있다. 더 아래쪽의 메모리를 확인해보면 인자값이 다음과 같이 들어간 것을 확인할 수 있다. 대략 0xbffe75f8을 argv[2]의 위치로 고른다. 4. 페이로드 ./vampire $(python -c 'print "..

Write-Up/LOB 2019.11.28

FTZ:Level 19

1. hint 로 attackme 소스코드 확인 stdin에서 값을 입력받아 buf 배열에 저장한 후, printf 함수를 이용하여 출력한다. 쉽게 생각하면 RTL 기법을 이용하여 system("/bin/sh"); 를 ret 부분에 넣으면 될 것 같지만 코드 내부에 권한 상승을 시켜주는 setreuid() 함수가 없어 총 두번의 함수를 강제로 호출시켜주어야 하는 문제이다. => RTL Chaining 기법 필요. 2. RTL Chaining RTL 기법은 ret에 공유 라이브러리의 함수 주소를 넣어 임의의 함수 호출을 한번만 진행한다. 하지만 RTL Chaining 기법에서는 새로 호출한 함수의 RET 부분에 지속적으로 RTL 기법을 이용하며 스택의 포인터를 다음 함수로 보내는 방법을 사용할 수 있다. ..

Write-Up/FTZ 2019.11.28

LOB: gremlin->cobolt

gremlin의 홈 디렉토리에 있는 colbolt.c를 확인해보면 첫번째 인자값을 버퍼에다 복사하여 버퍼를 출력하는 코드이다. 두가지 방법을 이용하여 문제를 풀어보도록 하자. 1. 환경변수를 이용한 쉘코드 익스플로잇 항상 하던 대로 다음과 같이 SHELLCODE라는, 쉘코드를 담은 환경변수를 저장합니다. 환경변수의 주소를 출력하는 코드를 간단하게 짜고 실행하여 SHELLCODE 환경변수의 주소를 알아낸다. cobolt 프로그램의 스택을 보면 str에 할당된 16바이트 뒤에 바로 함수 에필로그가 들어가므로 다음과 같이 쉘코드를 짤 수 있다. 2. RTL을 이용한 exploit RTL : Return-to-libc. 메모리에 적재된 공유 라이브러리를 이용해 원하는 함수를 끌어다 쓰는 공격 기법이다. 일반적으..

Write-Up/LOB 2019.11.27

#n+1 이제 키보드 입력을 통한 쉘을 만들어봅시다.

우리가 평소에 우분투나 윈도우에서 사용하는 쉘도, 결국 키보드 입력을 받아 그에 맞는 명령어를 실행시키는 것과 같다. 그럼 이 작은 운영체제에도 비슷한 방법으로 쉘을 구현할 수 있지 않을까? 큰 틀은 비슷하다. 이미 이전 포스트에서 소문자 알파벳을 입력받아 실행하도록 구현했으니, 이번에는 엔터를 구현하고 엔터를 누르는 순간 지금까지 입력했는 문자열에 맞는 명령어를 실행시키도록 한다. 먼저 기능 구현 전, 메인에서 사용할 수 있도록 버퍼와 쉘에서 사용할 현재 line과 col을 data.h에 구현해준다. unsigned char keyboard[videomaxcol]; unsigned short kindex; unsigned short curline; unsigned short curcol; keyboar..

#n 중간 건너뛰고 키보드 드라이버 처리

바로 앞 14강에서는 키보드의 입력을 받는 처리를 진행해주었다. 이번 파트에서는 입력은 되었지만 아스키코드로 변환이 되지 않는 부분을 고쳐줄 예정이다. 먼저, interrupt.h에 다음과 같이 함수 하나를 선언해준다. unsigned char transScan(unsigned char); interrupt.c에 다음과 같이 transScan 함수를 구현해준다. 일일이 잡작업하는 함수긴 하지만, 키보드의 스캔 코드에 따라 알맞은 알파벳으로 변경하는 함수이다. 스캔 코드는 키보드가 하드웨어에게 어떤 키를 눌렀는지에 대해 보내주는 데이터이다. 제일 처음 만들어진 스캔코드 세트는 1이고, 최신에 와서도 하위 호환성을 유지하기 위해 set1을 꾸준히 사용한다. 그래서 이 운영체제에서도 키보드 스캔 코드는 set..

운영체제 12주차

뭐했다고 벌써 12주차죠? ㄴㄴ 과제 제목은 CPU 스케줄링 --- 메모리 주소 (주기억장치!) 18로 나뉜 메모리의 각 영역은 메모리 주소로 구분하는데 보통 0번지부터 시작 CPU는 메모리에 있는 내용을 가져오거나 작업 결과를 메모리에 저장하기 위해 메모리 주소 레지스터(MAR)를 사용 갑자기 가상 메모리를 사용한다는데 이게 무슨 뜻인지 모르겠어요 졸려 죽겠음 굉장히 큰 하드의 용량을 좀 떼고 그걸 가상기억장치로 사용을 하는데 아무튼 지금 얘기 아님 그 위에꺼? 폰노이만 구조가 먼저 나오고 메모리 주소 내용이 나와야 한다. 그니까 어쨌든 뭐냐 MAR 사용하게 되었다가 중요. 메모리 관리의 이중성 프로세스 입장에서는 메모리를 독차지 하려고 하고, 메모리 관리자 입장에서는 관리를 효율적으로 하고 싶어함 엄..

Computer 2019.11.22