전체 글
-
Level12 (golem -> darkknight)$ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:33
위의 코드를 확인해 보면 FPO 기법을 이용하는 문제 입니다. SFP는 무엇인가, FPO 기법이 무엇인가 에 대해서 먼저 공부를 해봐야 할 것 같습니다. FPO를 사용하기 위해서는 필요한 조건이 존재 합니다. 1. SFP 영역에서 1바이트 오버플로우가 반드시 일어나야 합니다. (strncpy에 보면 41-40 = 1 바이트) 2. 메인 함수 이외의 sub 함수가 필요합니다. (main 함수 이외에 problem_child 함수가 존재 한다.) SFP 란? Stack Frame Pointer의 약자로 Saved Frame Pointer 라고도 불립니다. 이전의 함수의 EBP 주소를 저장하는 공간 입니다. 1바이트를 이용해서 OverFlow를 실행해야 하는데, 여기서 1바이트는 SFP의 첫 바이트를 이야기 ..
-
Level11 (skeleton -> golem)$ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:31
위의 소스코드를 확인해 보면 egghunter 였었던 환경변수를 못쓰게 하는 구문이 사라져 있습니다. 하지만 stack destroyer이 새로 생겻는데 buffer부터 0xbfffffff까지 RET를 제외한 모든 부분을 0으로 초기화를 해버리는 역할을 합니다. 이런 상황에서 사용할수 있는 것은 라이브러리인데, 정적 라이브러리는 .a 로 끝나는 파일이며, 빌드를 할때 실행파일에 포함되는 파일입니다. 동적 라이브러리는 .so 로 끝나는 파일이며, 여러 프로그램에 공유 되는 라이브러리 입니다. 동적 라이브러리가 정적 라이브러리 보다 더 우선시 되기 때문에 -fPID 옵션과함께 해당 라이브러리 이름을 NOP 과 쉘코드로 하나 생성을 합니다. attack.c 는 임의의 함수 하나를 만들었습니다. 그리고 생성한 ..
-
Level10 (vampire -> skeleton)$ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:27
이번 문제는 ultra argv hunter 라는게 추가가 되었는데... 버퍼의 전범위를 초기화 하는 강력한 기능이다.. 이번에는 쉘코드를 어디다가 넣어야 할까.. 위와 같이 똑같은 실행파일을 하나 만들어주고 gdb -q 옵션으로 디버깅을 한번 해봐야 겠다. $esp 값을 문자열로 한번 확인해 보자. 혹시 쉘코드를 가지고 있는 주소가 있을 수도 있으니까? x/2000s $esp 로 확인하다가 거의 끝쪽에 현재 gdb로 열고있는 파일명이 들어가 있는 변수를 찾았다. 변수 명에 쉘코드를 넣어서 문제를 해결해야 할것 같다. 원본 파일의 파일명을 변경하면 위험할 수 있기 때문에 ln -sf 명령어를 이용해서 원본 파일에 심볼릭링크를 걸어서 문제를 해결하면 될것 같습니다. 해당 심볼릭 링크 파일에 core dum..
-
Level9 (troll -> vampire)$ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:25
코드를 확인해보면 argv[1][46]가 \xff면 안된다는 구문이 추가가 되어있습니다. \xff\xbf 를 피하기 위해서 NOP Sled 를 이용해서 쉘코드 중간에 NOP를 10만개 정도 넣어 보겠습니다. 위와 같이 core dump를 생성하고 쉘코드 앞에 적은 \x90 주소중 아무거나 하나 정해서 RET에 적으면 클리어가 됩니다. login : vampire password : music world
-
Level8 (orge -> troll)$ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:24
이번에도 마찬가지로 소스코드를 확인해 보겠습니다. 소스코드를 확인해 보면 if(argc != 2) 라는 조건이 추가 되어서 argv[2]을 사용할 수 없습니다. 결국 argv[0] , argv[1]만을 사용 해야 하고, 맨 아래에 memset(argv[1], 0, strlen(argv[1]))을 보면 argv[1]이 초기화 됩니다. 그렇기 때문에 쉘 코드를 삽일 할만한 곳이 argv[0]에만 가능합니다. 그래서 심볼릭 링크를 파일에 걸어서 실행 하는 방법으로 문제를 해결 해야 할 것 같습니다. 심볼릭 링크가 걸리지 않습니다. 그 이유는 삽입한 쉘 코드에 / 인 \x2f가 들어 있어서 경로에 지장이 생기기 때문입니다. 그래서 \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\..
-
Level7 (darkelf -> orge)$ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:23
소스코드를 확인해 보겠습니다. 여기서 유의해서 확인해 봐야할 소스코드는 strlen(argv[0]) != 77 입니다. argv[0]의 길이가 77이어야 한다는 뜻입니다. 그래서 한번 77글자를 넣어서 우회해 보겠습니다. 이렇게 우회가 가능한거 같습니다. a를 넣어준 이유는 argv error 를 우회하기 위해서 입니다. 그리고 level6문제랑 똑같이 하면 될 것 같습니다. core dump를 만들어 보겠습니다. orge 를 arge로 복사 해서 arge로 core를 만들었습니다. gdb -q -c core를 이용해서 분석을 해보겠습니다. 쉘코드 시작 주소는 0xbffffbc2 입니다. expliot 페이로드를 작성해 보겠습니다. login : orge password : timewalker
-
Level6 (wolfman -> darkelf)$ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:22
소스코드를 확인해 보겠습니다. check the length of argument 라고 해서 argv[1]의 길이를 48로 제한이 되어 있습니다. 하지만 argv[1]을 제한 했다면 argv[2]를 이용해서 해결하면 될것 같습니다. core dump를 떠서 한번 확인해보겠습니다. gdb를 사용해서 ret 주소를 한번 찾아 보겠습니다. RET 주소는 0xbffffc4a로 하면 될 것 같습니다. login : darkelf password : kernel crashed
-
Level5 (orc -> wolfman)$ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:18
소스코드를 확인해 보겠습니다. 바로전 level4 문제와 매우 유사합니다. egghunter + buffer hunter이 적용되어 있지만 40까지만 memset 하기 때문에 상관 없을 것 같습니다. 한번 문제를 풀어보겠습니다. 이번에도 core를 dump해서 문제를 풀겠습니다. core를 이용해서 gdb를 사용해 보겠습니다. RET 주소를 0xbffffc66 으로 잡고 exploit 페이로드를 작성해 보겠습니다. login : wolfman Password : love eyuna