본문 바로가기

분류 전체보기

OS 개발 13챕터 PIC를 컨트롤 하는 방법을 공부하고, 예외와 인터럽트에 대해서 핸들러들을 추가했다. PIC를 이용해서 하는 부분이 어렵고 헷갈렸지만 하드웨어를 제어하는 것 같아서 되게 신기했다. 빨리 콘솔 쉘을 만들어 보고 싶다. 더보기
OS 개발 12챕터 오늘은 GDT를 재설정 하고 TSS, IDT를 추가했다. IDT는 시스템 콜 공부하면서 조금 공부해 봤었는데 이번 기회에 확실하게 다시 알 수 있는 기회가 되어 좋았다. 앞으로는 문법 오류보다는 논리 오류에 좀 더 신경을 써서 코딩을 해야겠다.원래 알고 있던 지식과 새로 공부해서 알게된 지식이 조합을 잘 이루어 조금씩 탄탄해 지는 것 같다. 더보기
OS 개발 11챕터 오늘은 드디어 처음 IA-32e 모드로 들어와서 키보드 디바이스 드라이버를 만들었다. 이번 챕터에서는 느낄 수 있던 점이 몇 가지 있었다. 먼저 키보드와 마우스가 컴퓨터와 어떻게 통신을 하는지와 scan code라는 것에 대해서 확실하게 알았다. 그리고 예전에 Reversing.kr의 Windows Kernel 문제를 풀 때에는 단순히 커널 디버깅만 하면서 엄청 노가다를 해서 풀었었다. 그 때에는 왜 키보드 입력은 0x60 포트로 받아 들이는 지도 몰랐었고 scan code의 존재도 몰랐었다. 그 때는 그냥 아 커널은 이런가 보다 하면서 scan code도 직접 수작업으로 노가다 해서 테이블 만들어 풀었었는데 지금 생각해 보니까 정말 많은 노가다 였던 것 같다.. 머리가 나쁘면 몸이 고생한다는 말이 역시.. 더보기
OS 개발 10챕터 드디어 오늘 IA-32e 모드로 들어갔다. 지금부터 키보드 드라이버도 만들고 멀티 쓰레드 등등 이것 저것 할 것 같다. IA-32e 모드로 전환할 때는 약간 복잡해서 여러번 책을 읽어 봤었다. 그리고 또다시 오류와 맞닥뜨렸다. 이 오류는 진짜 너무 오랬동안 찾던 오류였다. 크게 세 가지가 있었는데 첫 번째는 makefile에 문제가 있었다. 64비트용 makefile을 만들 때 32비트 makefile을 가져와서 수정하는 방식으로 했는데 중간에 수정하지 못한 부분이 있었던 것이다. 그렇게 한참을 찾고 난 뒤에 다시 빌드해서 부팅을 했는데 계속해서 리부팅만 하는 거였다. 삽질한 결과 문제는 또 ImageMaker에 있었다. 소스를 업데이트 하면서 중간에 빠뜨린게 또 있어서 섹션이 제대로 정렬이 안됬었나보다.. 더보기
OS 개발 9챕터 9챕터는 IA-32e 모드로 전환하기 위해서 페이지 테이블들을 설정하는 작업을 했다. 처음에 페이징 공부할 때 진짜 머리가 터지는 줄 알았는데 직접 짜보면서 관계를 이해하고 보니까 좀 봐줄만 하다. 그래도 어렵다. 진짜 페이징 같은 것들을 다중 포인터로 해서 구상하는 사람들은 머리가 얼마나 좋은 건지를 모르겠다. 오류는 make 오류 메시지를 보고서 바로 알 수 있는 오류들이라서 많이 삽질 하지는 않았다. 하나하나 알아가는 맛이 쏠쏠한 것 같다. 더보기
OS 개발 8챕터 8챕터이다. 이번에는 A20 게이트를 이용해서 1MB 이상의 주소에 접근할 수 있도록 하고, IA-32e 모드로 넘어가기 위한 64비트 커널을 올릴 영역을 검사하는 부분을 만들었다. 그렇게 큰 어려움은 없었는데 빌드를 해서 부팅시켜 보면 이상하게 자꾸 글자가 중간에 짤리는 오류가 있었다. 그래서 이것저것 다 찾아보다가 저번에 만들어 놓은 ImageMaker가 오류라는 것을 알았다. 나는 책대로 소스를 잘 짰는데 어디가 오류인가 하고 봤더니 책 오탈자 리스트에서 lPosition = lseek( iTargetFd, 5, SEEK_SET ); 을 lPosition = lseek( iTargetFd, (off_t)5, SEEK_SET ); 라고 써야 한다는 것이다. 그래서 (off_t)5로 바꾸고 다시 컴파일.. 더보기
OS 개발 7챕터 이번에는 C언어로 짠 커널을 직접 로드하여 실행하는 부분을 했다.일단 무사히 잘 끝냈는데, 책에 있는 소스를 직접 손으로 옮겨 적었더니 진짜 오류가 장난 아니게 났다... 진짜 OS 목표 중 하나가 소스는 반드시 복붙 안하고 손으로 치기 였는데 고작 200줄 정도 따라 쳤는데도 오타만 6~7개가 났다.. 뒤에 막 파일시스템 만들고 하면 2000줄 정도 되던데 정말 큰일났다.. 더 웃긴건 오타가 너무 황당하다는 거였다. 오타 종류를 좀 적자면 확장자의 .을 ,로 적은거랑 목적 파일의 .o를 .0으로 적고, $를 안붙인다던가 objcopy 프로그램을 사용해야 되는데 평소 rop할 때의 버릇이 나와서 objdump 프로그램을 사용해서 또 오류 나고 ,를 m으로 적고 이것들 등등 진짜 여러가지 황당한 오류가 너.. 더보기
OS 개발 6챕터 방학동안 OS를 개발해 오던 스터디가 개학을 하면서 터지고, 잠깐동안 OS 개발을 멈췄다가 다시 OS 개발의 중요성을 느끼고 6주차 부터 다시 만들기 시작했다.6주차 내용은 리얼 모드에서 보호 모드로 전환하는 부분이다. 직접 cr0 레지스터랑 GDT를 설정하니까 되게 신기했었다. 다만 세그먼트 디스크립터에서 왜 굳이 Base 주소 비트를 여기저기 나눠놨는지를 모르겠다.. 참 이상하다. 더보기
Return Oriented Programming 기초 ROP 기초에 대한 지식이 부족하여 다시 공부하고 정리해서 올립니다~~ 먼저 보호 기법에 대해서 알아보겠습니다.NX(Non eXcutable) - 모든 주소에 쓰기 권한과 실행 권한을 동시에 주지 않는 보호기법입니다. 이로 인해서 코드 영역에는 쓰기를 할 수 없고 데이터 영역에는 실행할 수 없게 됩니다.PIC(Position Independent Code) - 코드가 어디에 존재하든지 서로 상대주소만 같다면 잘 동작하도록 하는 방법입니다. 베이스 주소와 코드의 오프셋으로 이루어져 있습니다.PIE(Position Independent Executable) - 위의 PIC를 바이너리에 적용 한 것입니다. 바이너리 내의 코드가 위 PIC처럼 베이스 주소와 상대 주소로 이루어지게 됩니다. 그리고 PIE가 걸려있.. 더보기
2016 CodeGate watermelon exploit 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182from SunKn0wn import * r = remote('192.168.179.135', 1111) def add(music, artist): r.recvuntil('select\t|\t\n') r.sendline('1') r.recvuntil('music\t|\t') r.sendline(music) r.recvuntil('artist\t|\t') r.sendline(artist) def view(): r.recvuntil('.. 더보기