본문 바로가기

전체 글115

해커스쿨 L.O.B level 3 [cobolt] cobolt 로그인 후 파일을 확인한다. 역시 코드 파일을 열어서 goblin이 어떤 코드로 만들어졌는지 분석한다. gremlin 문제와 같은데 받아오는 함수가 strcpy와 gets에서 다르다. F.T.Z에서 gets 함수로 받는 코드를 stdin으로 공격하는 것을 많이 해봤을 것이다. F.T.Z를 풀고 와서 하는 문제라고 해서 좀 더 어려울 줄 알았는데 level 3까지는 아직 F.T.Z와 비슷한 난이도다. gdb를 보면 ebp-16인것으로 보아 지금까지 문제와 비슷하다. 더보기 환경변수를 넣고 주소를 받아온다. 주소를 알았으니 공격하면 된다. 그런데 stdin으로 공격해야 하므로 지금까지의 공격과는 다르게 공격한다. 그러나 F.T.Z에서 했던 공격이다. 2020. 5. 17.
해커스쿨 L.O.B level 2 [gremlin] gremlin 로그인 후 파일을 확인한다. gate와 같이 실행파일과 코드 파일 두 개 있다. 코드 파일을 열어서 분석한다. gate 문제와 같고 다른 건 배열의 크기만 다르다. gdb를 봐도 gate 문제와 스택이 ebp-16로 크기만 다를 뿐 문제는 같다. gate 문제와 같은 방식으로 공격하면 된다. 더보기 export로 환경변수를 넣어준다. 이때 셸 코드는 25byte가 아닌 41byte or F.T.Z에서 사용했던 eggshell에 있던 셸 코드를 사용하길 바란다. 본인은 eggshell에서 사용하던 셸 코드를 사용하였다. 환경변수를 넣었으면 getenv 함수로 환경변수가 들어가 있는 주소를 얻어온다. 환경변수를 넣고 주소를 얻었으면 스택 구조만큼 BOF를 일으키면 되는데 스택 구조를 도식화하면.. 2020. 5. 16.
해커스쿨 L.O.B level 1 [gate] 해커스쿨 L.O.B level 1 [gate]를 시작한다. F.T.Z에서와같이 어떤 파일이 있는지 확인하고 힌트가 될만한 파일을 읽어본다. 파일이 두 개 있다. F.T.Z에서 해왔던 대로 코드를 열어서 분석해야 한다. 주석은 간단한 힌트 같은 느낌이고 코드를 보면 F.T.Z 난이도와 비슷한 문제다. strcpy는 복사할 때 크기를 검사하지 않기 때문에 BOF에 취약하다고 F.T.Z level 11, level 13에 나왔다. gdb를 확인해 본다. 이때 gremlin.c는 gate의 권한이지만 gremlin 실행파일은 gremlin의 권한이다. gdb로 디스어셈블을 할 수는 있지만 gdb에서 r 명령어로 쓰려고 하면 권한 오류가 난다. 그러므로 r 명령어를 쓰려면 cp 명령어로 gate 권한의 파일로 복.. 2020. 5. 16.
해커스쿨 L.O.B 로컬서버 구축 해커스쿨 L.O.B 로컬서버 구축을 설명한다. 해커스쿨 L.O.B는 해커스쿨 F.T.Z를 마치고 온 사람들이 사용할 것을 알기에 가상머신 VMware가 있을 것은 전제로 하겠다. 기본적으로 F.T.Z 로컬서버 구축하는 방법하고 거의 같다. 1. 해커스쿨 L.O.B 이미지 파일 해커스쿨 L.O.B 이미지 파일 다운로드 해커스쿨 L.O.B를 실행하면 이 문구가 나온다. 다른 분들의 포스팅에서는 이때 linux-up을 입력해주어야 오류 나지 않고 부팅이 잘 된다고 한다. 그러나 본인은 입력하지 않아도 알아서 입력하는 모습을 볼 수 있었다. 이는 해커스쿨 공식 홈페이지 공지에 있는 글에 의하면 부팅이 안 되는 오류를 수정해서 다시 이미지 파일을 올렸다고 한다. 위 이미지 파일 링크가 그것이다. 부팅이 끝이 나면.. 2020. 5. 15.
해커스쿨 L.O.B 시작 해커스쿨 L.O.B 포스팅을 시작하기에 앞서 정보공유를 하려 한다. 해커스쿨 F.T.Z를 모자란 실력으로 해결했다. F.T.Z를 해결한 후 모자란 C언어 공부를 했다. 어셈블리어를 조금 맛을 보았고 LOB와 병행하려 한다. 코딩을 배운 지 얼마 되지 않았고 C언어, 어셈블리어를 자세히 알지 못한다. C언어 공부는 "독하게 시작하는 C 프로그래밍 최호성 지음"으로 인터넷 강의를 들으며 공부를 했다. 인터넷 강의는 인프런, 유튜브에 공개되어 있었으나 2023년 6월 1일부터 인프런에는 강의가 내려갔고, 유튜브에는 회원전용으로 바뀌었다. (2024.03.14 수정) 어셈블리어는 "게임처럼 쉽고 재미있게 배우는 어셈블리 언어 튜토리얼 원일용 지음"으로 인터넷 강의를 들으며 공부하고 있다. 인터넷 강의는 인프런,.. 2020. 5. 15.
해커스쿨 F.T.Z level 11 FSB(Format String Bug) level 11을 이미 BOF로 해결했다. level 20에서 포맷 스트링 버그를 다루기 때문에 level 20을 해결하고 포맷 스트링 버그 복습 차원으로 level 11에는 링크로 남겨두었던 포맷 스트링 버그도 발생하기에 BOF가 아닌 포맷 스트링 버그를 사용해서 해결해 보기 위해 level 11에서 포스팅 하지 않고 level 20을 해결 하고 포스팅한다. FSB를 level 20에서 이해한 만큼 설명했으므로 바로 문제로 넘어간다. level 11 로그인 후 hint를 본다. level 20과 같이 level 11에서도 printf 함수에서 포맷 스트링을 사용하지 않았기 때문에 여기서 FSB가 일어나게 된다. 포맷 스트링을 입력해본다. 포맷 스트링을 입력하게 되면 메모리의 다음 4바이트 위치를 참조하.. 2020. 3. 3.
해커스쿨 F.T.Z Level 20 level 20 로그인 후 hint를 본다. bleh 배열 80byte, fgets에서 79byte를 받는다. BOF를 할 수 없는 조건이다. 다른 방법을 찾으면 level 11에서 링크로 대체했던 포맷 스트링 버그(FSB)를 발생시킬 수 있다. 포맷 스트링 버그(Format String Bug, FSB) 포맷 스트링 버그는 printf 함수에서 발생하는데 printf 함수를 사용할 때 포맷 스트링을 사용하지 않고 위 hint와 같이 print(bleh)를 사용하면 취약점이 일어난다. 이때 입력 값을 포맷 스트링으로 넣으면 입력 값을 문자로 취급하는 게 아닌, 서식문자로 취급한다. 포맷 스트링(Format String) parameter 변수 형식 %d 정수형 10진수 상수 (int) %f 실수형 상수 .. 2020. 3. 2.
해커스쿨 F.T.Z Level 19 level 19 로그인 후 hint를 본다. level 18에 비해 코드가 엄청나게 간단해졌다. 그러나 간단해져도 너무 간단해졌다. 사용자를 바꾸는 setreuid 함수까지 없는 간단한 코드가 되어서 level 11에서 만들었던 쉘코드만으로는 해결할 수가 없다. level 11 쉘코드로 실행하면 사용자 변경 없이 그냥 쉘코드가 실행된다. level 19 hint와 같이 글로 준 hint를 합쳐 생각하면 setreuid를 실행하는 쉘코드를 만들어 이전 쉘코드와 함께 사용하면 된다. setreuid 쉘코드 사용자 ID를 바꾸는 setreuid 함수의 인자로는 사용자 ID에 해당하는 uid이다. 쉘코드를 만들기 위해서는 얻고 싶은 ID의 uid를 알아야 한다. level 20의 uid는 3100이다. 인자를 .. 2020. 2. 29.
해커스쿨 F.T.Z Level 18 level 18 로그인 후 hint를 본다. 엄청나게 긴 hint가 나온다. 코드가 긴 만큼 gdb 분석도 길어서 겁먹기에 십상이다. 모르는 함수들이 많고 코드가 길어도 시스템 해킹에서는 언제나 "root의 권한으로 쉘을 실행시킨다"라고 생각하면 쉽다. 위와 같이 생각하고 코드를 보게 되면 변수들이 선언되고 변수 check 값이 0xdeadbeef면 shellout 함수가 실행되는 아주 간단한 코드가 된다. 여기서 알아야 할 것은 "먼저 선언된 변수가 높은 메모리 주소를 가진다"는 것이다. 이것을 알면 스택 구조도 쉽게 파악할 수 있다. 스택 구조를 보게 되면 아래와 같다. 스택 구조 fds 4byte count 4byte x 4byte check 4byte string[100] 100byte SFP 4.. 2020. 2. 29.
해커스쿨 F.T.Z Level 17 level 17 로그인 후 hint를 본다. level 16 hint 코드에서 shell 함수가 빠지고 setreuid는 main으로 들어오게 됐다. 이렇게 되면 level 16처럼 shell 함수의 주소도 없고 level 14처럼 글자를 대조하는 것도 아니고 level 15처럼 주소를 넣는 것도 할 수 없다. 여기서 해야 하는 건 setreuid가 실행되고 쉘을 실행해야 level 18의 uid를 얻을 수 있다는 것이다. 일단 gdb를 확인해 본다. main+3에서 0x38(56)byte 확보하고 main+6에서 0x8048490 주솟값을 ebp-16에 저장한다. main+57에서 ebp-16을 eax에 저장하고 eax를 call 해서 call 함수를 불러온다. 코드는 다르지만, 프로그램의 메커니즘은 .. 2020. 2. 27.