일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 24시간의 전사
- ZIP 파일구조
- 생활코딩 html
- 생활코딩
- 실기
- 포렌식
- 디지털포렌식
- slack space
- Multimedia
- 네트워크관리사2급
- ftz
- blkls
- 윈도우 프로세스
- vinetto
- network
- Multimeida
- 슬퍼유
- N0Named
- 디지털포렌식 with CTF
- 네트워크 보안
- 정보처리기사 필기 합격
- disk
- 는 하지마...
- Window process
- 2022시작
- CTF-D
- html
- 윈도우 프로세스 종류
- memory
- pythonchallenge
- Today
- Total
목록ftz (13)
ssoL2 TISTORY
attackme가 존재하고 hint로 코드를 살펴봅시다. 굉장히 긴 코드 등장. 역대급 코드 인정? (그래서 원래 가운데 정렬하는데 이번에는 왼쪽 정렬한다..쓸게 많아,,) 코드를 읽어보면서 중요한 것들만 골라내면 다음과 같다. 1. count >=100이면 "뭐하는거냐?" 문구 출력 2. check == 0xdeadbeef이면 shellout() 실행 => shell권한 획득 !! **중요 3. read 함수로 stdin 입력 받은 것을 1 byte씩 x에 저장 3-1. x가 '\r', '\n'이면 "\a" 출력 3-2. x가 0x08이면 count 1 빼고, "\b \b" 출력 3-3. 위 두 경우가 아니라면 string[count]에 변수 x값을 넣고, count 1 더한다. 결론적으로 다음 쉘을 ..
level16 / about to cause mass hint를 봅시다. main 함수를 보면 call 함수 포인터 선언하고 buf bof 일으켜서 printit 가리키던 것을 shell로 덮으면 되는 문제이다. 찾아야 하는 건 buf 위치, call 위치, shell 주소 이렇게 3 가지 찾으면 되겠습니다~ 처음으로 c 코드 있어서 보려했더만 접근이 안되는구만,,^^; gdb로 살펴보겠습니당~ mov 어셈블리에서 주소를 ebp-16에 넣는 걸 보면 ebp-16이 call 함수 위치네유~ 이후 fgets의 인자로 사용되는 buf는 ebp-56이구용~ buf 위치와 call 위치를 찾았으니 bof 일으켜서 call에 넣을 shell 주소를 찾아봅시당~~ shell 함수는 전역 함수니까 main 위에 위치해..
level15 / guess what level14와 같은 문젠데 하나 다른 점은 check이 포인터 변수라는 점! buf에 bof일으켜서 check을 0xdeadbeef가 담긴 주소를 가리키게 만들면 된다. 현재 해야할 것은 0xdeadbeef 주소 찾기. gdb로 살펴보면 fgets의 인자로 사용하는 buf는 ebp-56에 위치하고, cmp로 비교하는 check 포인터 변수는 ebp-16에 위치한다. 포인터 변수는 그냥 변수랑 비슷한데 다른 점은 가리킬 주소를 담고 있다는 것이다. 따라서 0xdeadbeef가 아닌 0xdeadbeef를 "담고 있는" 주소를 담아야하므로 해당 주소를 찾아야한다. 0xdeadbeef와 변수를 비교하는데, 메모리에 직접 로드되야하므로 어딘가엔 있을 것이다. 그래서 직접 활..
level14 / what that nigga want? level14부터도 bof에 대해 푸나봅니다. 아무튼 문제를 보면 fgets로 인한 bof 문제이고, 조건으로 check에 0xdeadbeef가 있으면 자동으로 쉘 실행되네요. 그럼 bof 일으키고 중간에 check 변수만 제대로 해주면 그냥 풀리는 문제. gdb로 스택 구조를 살펴봅시다. fgets 함수 인자로 사용되는 buf는 ebp-56에 위치하고, if문인 cmp를 보면 0xdeadbeef와 비교하는 ebp-16이 check 변수 위치임을 알 수 있습니다. 그러면 최종적으로 아래와 같은 구조를 갖습니다. buf와 첫번째 dummy에 NOP을 덮고 check에 0xdeadbeek를 덮으면 자동으로 쉘이 출력되는 구조입니당 이 문제는 다른 문제..
level13 / have no clue hint를 봅시다. 인자는 1개 이상이고, 그 인자를 bof하는 문제인 것 같다. 하지만 i 변수가 변하지 않는 조건으로 bof 해야 하는 문제이다. i를 침범하면 kill 시스템콜로 프로세스가 죽는다. gdb로 i 변수와 buf 배열 사이의 간격을 찾아봅시다. strcpy의 인자인 buf는 ebp-1048 위치에 있으며 if는 cmp로 ebp-12에 있는 값과 0x1234567과 비교하므로 i는 ebp-12에 위치한다. 따라서 ebp-1048는 buf 위치고 ebp-12는 i 위치이므로 구조는 아래와 같다. buf랑 dummy 두 개에는 NOP으로 채우고 i는 그대로 0x1234567로 변조하지 않게 한 뒤에 level 11, level12에서 풀었던 방법인 R..
level12 / it is like this hint를 보니 LEVEL 11과 매우 유사한 문제이다. LEVEL 11에선 strcpy bof였다면 이 문제는 gets bof 문제이다. LEVEL 11 했던 것처럼 RTL 기법으로 풀어봅시다. gdb로 gets 인자로 사용한 STR 변수 위치 알아봤더니 EBP-264입니다. buffer(264) + ebp(4) + system주소 + nop(4) + /bin/sh주소 구조로 exploit 작성할 것이다. 필요한 system 주소와 /bin/sh 주소를 알아봅시다. ldd 명령어로 라이브러리 획득 해당 라이브러리에서 system 주소(\x4203f2c0)와 /bin/sh 주소(\x42127ea4) 획득 (이때 /bin/sh 주소 앞에 \x42 생략됨) (-..
level11 / what!@#$? hint를 보니 strcpy 함수를 이용한 bof 문제인듯! Setuid도 걸려있으니까 str을 bof해서 쉘코드를 넣으면 되겠다. 정확한 스택 구조를 알기 위해서 gdb로 살펴봅시다. main 함수에서 사용하는 strcpy 함수에서 인자로 사용되는 STR 변수의 위치를 알아냄 => EBP-264 그런데 이 문제에서는 쉘코드를 STR 변수에 넣고 RET에 STR 변수 "주소"를 직접 넣어야 하므로 정확한 STR 주소를 알기 위해서 breakpoint를 이용합시다. breakpoint를 strcpy 함수가 끝난 부분에 걸어서 인자값을 넣을 때 어느 위치에 위치해있는지 확인합시다. "a"를 100번 넣어서 주소를 확인하려 했는데 "Couldn't get registers:..
level10 / interesting to hack! key_t 값이 7530인 공유 메모리를 읽고 level11의 권한을 얻으라는 문제이다. 공유 메모리 : 보통 프로세스에서 사용되는 메모리영역은 해당 프로세스만이사용할수 있다. 하지만 때때로 여러개의 프로세스가 특정 메모리영역을 사용했으면 하는때가 있을것이다. 이때 사용하는 것이 공유 메모리이다. 출처: https://unabated.tistory.com/entry/공유-메모리-shared-memory [랄라라] 일단 level11 SetUID를 가진 파일은 찾을 수 없다. 지금 할 수 있는 건 공유 메모리에 접근하는 것뿐이다. ipcs 명령어를 통해 현재 생성되어 있는 IPC 지원 목록을 조회 가능하며 [-m] 옵션으로 공유 메모리 자원만 볼 수 ..
level9 / apple cat hint 명령어로 hint를 봅시다. /usr/bin/bof 실행파일의 소스를 주었다. 딱 보니 fgets 함수로 buffer overflow = bof 를 일으키려는 모양입니다! bof 란 buffer overflow로 말 그대로 버퍼를 넘치게 해서 취약점을 얻는 해킹 방법입니다! main 함수를 보면 buf2랑 buf를 10 bytes씩 할당하고, fgets 함수로 10 bytes 밖에 안되는 buf에 최대 40 bytes만큼 입력받아서 buf2까지 덮어씌워지게 하는 문제. if 문에 있는 strncmp 함수를 보면 buf에 'go'가 있도록 해야 setuid를 얻을 수 있겠죠? 여기서 10bytes씩 나란히 할당했다고 해서 실제 스택에 buf와 buf2가 붙어 있는..
level 8 / break the world 짜잔 hint 살펴보니 level9의 shadow 파일을 찾으라는 것, 이 파일은 용량이 2700이라는 것 !! 2700 용량을 가진 파일을 찾으려면 find 명령어로 쉽게 찾을 수 있을 것이다 !!! find --help 로 용량 옵션을 찾아보니 [-size] 옵션을 사용하면 된다고 설명한다. 그래서 find 명령어로 옵션 [size]를 같이 써서 찾아보려 했으나 나오는 결과는 없었다........그럴리가 없는데,, 알아보니 용량 사이즈를 적을때 뒤에 단위가 붙지 않으면 디폴트값으로 b로 블록단위였다 ! 지금보니 위에 --help 설명서에도 -size 뒤에 [bckw]라고 나와있다..... ㅇㅅㅇ;; 따라서 바이트 단위인 c를 붙여주면 된다. 또잉? 가장 ..
level 6 / what the hell 예? 다짜고짜 힌트를 준다고요? 프롬프트는 어디갔구요? 아무거나 치고 엔터 쳤더니 꺼져버렸음.. 읭? 다시 들어가서 이번엔 바로 엔터를 쳤더니 바로 텔넷 접속 메뉴로 넘어온듯 1번 눌렀더니 IP 주소에 접속하는 모습이다.. 그런데 얼마 지나고 또 꺼져버리는 창,, 나한테 왜그래여 2번 선택하고 3번 선택해도 넘어가지 않고 계속 창이 꺼져버린다.. 으아ㅏㅏㅏㅏㅏㅏ 그래서 처음부터 돌아와서 1. 어떠한 것을 입력하면 꺼지고 2. 엔터치면 꺼지므로 마지막으로 리눅스 쉘 프롬프트에서 나갈때 사용하는 ctrl+c를 해봤더니 탈출을 성공했다. 이제 ls하고 상황 살펴보니 처음에 봤던 hint가 요있네.. 아마 이 hint를 처음 시작할 때부터 보여주도록 해놓지 않았을까....
1. [접속id@서버 현재위치]$ => 프롬프트 2. linux는 대소문자 구분한다. 3. ls 현재 위치에서 보여줌 [-a] 숨겨진파일(.) [-l] 디렉토리(d), 파일(-) 구분 4. ls 끝부분 => 생성용량 생성날짜 파일명 1. pwd => 현재 경로 2. 프롬포트에 나오는 현재위치는 현재경로 맨 뒤 디렉토리 3. /는 최상위 디렉토리 4. cd => 경로 바꾸기 [..] 한단계 위로 5. mkdir 디렉토리 rmdir 디렉토리 6. cp 파일1 파일2 => 파일1을 복사해서 파일2 생성 7. rm 파일 => 삭제 8. mv 파일1 파일2 => 파일1을 파일2에 덮어씀 1. 텔넷으로 접속 한 것을 "터미널"로 접속했다고 한다. 2. 직접 컴퓨터에 linux 설치 후 접속한 것을 "콘솔"로 접속했..