일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- hackctf
- Sookmyung Information Security Study
- BOJ Python
- lob
- 숙명여자대학교 정보보안동아리
- XSS Game
- WarGame
- CSS
- 웹페이지 만들기
- The Loard of BOF
- 기계학습
- 백준
- 머신러닝
- hackerrank
- 숙명여자대학교 정보보안 동아리
- BOJ
- 생활코딩
- c++
- 파이썬
- 드림핵
- Javascript
- HTML
- PHP 웹페이지 만들기
- C언어
- 풀이
- Python
- SWEA
- c
- siss
- 자료구조 복습
- Today
- Total
혜랑's STORY
[LOB RedHat] Lv 1. gate -> gremlin 본문
문제를 풀기 위해 xshell에서 gate로 로그인 해 주었다.
ID : gate PW : gate |
가장 먼저 존재하는 파일을 알아 보기 위해 ls -l 명령어를 실행하였다. 그 결과 gremlin.c 파일과 gremlin이라는 파일이 있는 것을 확인할 수 있다.
gremlin 파일은 gremlin.c 파일을 컴파일하여 만들어진 파일 같다. gremlin.c 파일을 열어 내용을 확인해 보도록 하자.
위 코드를 살펴본 결과 256 바이트 버퍼 buffer를 스택에 할당한 후, strcpy 함수를 통해 argv[1]의 내용을 buffer에 복사하게 된다. strcpy 함수가 buffer를 복사할 때, buffer의 크기인 256 바이트가 넘는 문자열을 전달한다면 길이 제한 없이 문자열이 복사되어 스택 버퍼 오버플로우가 발생하게 된다.
gdb를 사용해 main 함수의 어셈블리 코드를 살펴보자.
- set disassembly-flavor intel : 어셈블리 코드 문법을 intel로 설정
- disas [함수이름] : 함수의 어셈블리 코드를 보는 명령어
main 함수의 스택 프레임을 보면 "sub %esp, 0x100" : esp를 0x100(256) 만큼 뺀다. 따라서 스택 상황은 아래와 같다.
buffer | SFP | RET(return) |
256 | 4 | 4 |
버퍼의 시작 주소를 알아내기 위해 strcpy 함수의 인자로 buffer가 전달되는 부분에 bp(break point)를 걸고 실행해서 분석을 진행하려 하였으나 권한 문제로 진행할 수 없었다. 따라서 이 바이너리를 cp 명령어를 통해 복사해 주었고 그 결과 gate에게 권한이 있는 바이너리가 생성되게 되었다.
<main+62> 부분에 bp를 걸고 buffer속에 A를 넣어 buffer의 주소를 알아내 보자. 입력할 공격 코드는 아마 아래 표와 같은 형식을 가질 것 같다. A를 여러개 놓아둠으로써 정확하게 쉘 코드의 주소를 알아낼 필요 없이 수많은 A 중 아무 주소만 알아내고, 나중에 nop로 바꿔주면 미끄러지듯 쉘 코드가 실행되게 될 것이다.
공격 코드 | |||
buffer(256 byte) |
SFP(4 byte) | RET(4 byte) | |
\x90 * 236(236 byte) | 쉘코드(24 byte) | \x90이 들어있는 주소 |
이때 사용한 쉘 코드는 다음과 같고, 인터넷에서 검색해서 24 바이트의 쉘코드를 찾아왔다.
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80 |
아까 복사해둔 cpgremlin 파일에 다음과 같은 값을 대입한 뒤 코어 파일을 살펴보자.
이때 우리가 실제 공격을 할 때와 같은 길이의 파라미터를 줄 것이다. Segment fault가 발생하고, 코어 덤프(특정 시점에 작업 중이던 메모리 상태를 기록한 것)가 되었다. 이제 gdb를 통해 core 파일의 내용을 확인 해 볼것이다.
gdb가 실행되며 EIP가 0x42424242로 점프해 segmentation fault가 발생했다는 것을 알 수 있었다. 다음 스택도 확인해 주었다.
메모리가 앞서 넣어준 "A"로 도배된 것을 확인할 수 있었고, 그 끝에 "B"가 쓰여있었다. 즉, "A"로 채워진 영역에 nop와 쉘 코드를 담아주면 된다. 나는 "0xbffffbb0"로 골라주었다. (그냥 숫자가 편할거 같아서 고름)
이제 다음과 같이 공격 코드를 구성할 수 있었다.
./cpgremlin `python -c 'print "\x90"*236 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\xb0\xfb\xff\xbf" '` |
드디어 쉘이 실행된 것을 확인할 수 있다.
그러나 복사한 해놓은 파일이었기 때문에 이제 원본 파일에 공격을 시도해 보았고, 다음과 같은 결과를 얻을 수 있었다.
이렇게 gate에서 gremlin으로 가는 비밀번호를 얻어내었다.
'2021 SISS 21기 활동 > 겨울방학 System' 카테고리의 다른 글
[LOB RedHat] Lv 3. cobolt-> goblin (0) | 2021.01.30 |
---|---|
[LOB RedHat] Lv 2. gremlin -> cobolt (0) | 2021.01.30 |
[2021 겨울 시스템 2주차 : Bandit:Over the wire Level5 -> Level10] (0) | 2021.01.17 |
[2021 겨울 시스템 2주차 : 달고나 문서 정리(5 마무리)] (0) | 2021.01.17 |
[2021 겨울 시스템 1주차 : Bandit: Over the wire Level0->Level5] (0) | 2021.01.10 |