lob
-
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
-
Level4 (goblin -> orc)$ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:16
소스코드를 확인해 보겠습니다. egghunter이란 환경변수 부분을 0으로 초기화 하는 역할을 하는데, 그래서 이전에 사용한 환경변수 관련된 문제 풀이는 사용할 수 없습니다. 그리고 argv의 47번째 바이트가 \xbf 인지 확인 합니다. buffer의 크기 40바이트 + SFP 4바이트 + RET 4바이트 = 48바이트 하지만 argv[1]의 47번째 바이트가 \xbf 인것으로 보아 RET 첫번째 주소의 시작값이 \xbf 라는 것을 알수 있습니다. 또한 gdb로 열어보면 코드 영역은 0x80~~의 주소를 가지고있고 우리가 필요한 \xbf 는 Stack 영역에 있는 주소입니다. 이제 한번 core dump를 해보겠습니다. RET에 들어가야하는 주소를 찾기 위해서 gdb -q -c core 명령을 통해 알..