본문 바로가기

OS 개발 14챕터 주말동안은 pctf를 하느라 OS 코딩을 못했다. 오늘은 키보드 디바이스 드라이버를 업그레이드 했다. 이전에는 입출력 포트를 무한 루프를 돌면서 키 입력을 받았었다면 이번에는 큐 자료구조를 만들고 인터럽트로 키보드 입력을 받아서 처리하도록 했다. 내일 이제 유저와 상호작용하는 쉘을 짜야겠다. 더보기
PlaidCTF 2016 quite quixotic quest - 300pt 아이디어가 굉장히 참신해서 재밌던 문제였다. curl 라이브러리를 바탕으로 그대로 가져와서 중간에 --pctfkey 인자를 추가해서 키를 입력할 수 있게 하였다. 실제 curl 라이브러리에는 저런 인자가 없다. IDA로 열어서 저 인자로 주었을 때의 동작을 봤더니 스택 자체를 아예 바꿔버리고 리턴을 해버린다. 즉, 연산 루틴 과정을 코드가 아니라 ROP처럼 리턴으로 이루어진 연산을 하게 된다. 여기서부터 이 문제는 아이디어가 되게 좋다고 생각했다. 진행을 해 보면 리턴을 하다가 strlen함수로 가서 입력한 키 값의 글자를 구한다. 그리고 몇 번의 리턴 후에 pop edx 명령어를 수행한다. 위 레지스터에서 ebx가 strlen으로 구한 값이고, edx가 스택에서 pop 한 값이다. 그리고 sub 연산을.. 더보기
PlaidCTF 2016 quick - 175pt 일어나서 첫 번째로 푼 문제이다. IDA로 까 보면 스위프트로 짜여 있어서 좀 더럽다. 그래도 몇 번 보다 보니까 익숙해져서 풀 수 있었다. 디버깅 하면서 보니까 먼저 값을 입력받고, sub_403660함수에서 연산을 한다. 이렇게 테이블이 있고, 연산을 해서 저 테이블이랑 비교를 하는 부분이 두 군데가 있다. 그런데 첫 번째 부분은 입력값이 쓰이지 않는 연산이라서 그냥 패치를 해서 넘겼고, 두 번째 연산에서 입력값이 쓰여서 이 부분만 분석했다. 먼저 연산은 sub_403510 이 함수에 있는 것이 전부라고 해도 과언이 아니었다. 보기가 좀 거슬리기 때문에 중요 부분만 뽑아서 다시 짜봤다. 1234567891011#include int main(void) { unsigned char table[34], .. 더보기