일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 웹프로그래밍과
- pwnable.kr
- 플러터
- 워게임
- 디지털컨텐츠과
- graphql
- 풀스택
- 등교개학
- 특별전형
- 중3
- 우분투
- 인공지능
- 시스템해킹
- 딥러닝
- WebHacking
- 코로나19
- 디미고특별전형
- 웹개발
- 디미고입학
- 학생
- 머신러닝
- apollo
- 디미고
- TensorFlow
- 해킹방어과
- 일상
- 이비즈니스과
- 대나무숲
- coursera
- Flutter
- Today
- Total
꿈이 너무 많은 한 대학생의 공간
Pwnable.kr - bof 문제풀이 본문
드디어 시스템 해킹의 첫 관문인 버퍼오버플로우 문제를 풀어보겠습니다.
푸는 방법은 이해했지만 포너블에 아직 익숙치 않아 어떻게 쉘코드를 입력해야 하는지 고민 끝내 풀이를 보고 찾아냈습니다..
먼저 실행파일과 소스코드를 wget 명령어를 통해 다운받겠습니다.
func에 0xdeadbeef 를 넘기고 func 내에서 overflowme 라는 지역 변수를 선언합니다. 그 후 overflowme 에 gets 함수를 통해 key(0xdeadbeef) 와 0xcafebabe 가 일치하는지 확인하고 일치한다면 쉘을 실행, 아니라면 Nah.. 를 출력하고 끝냅니다.
일단 취약점이 보이는 gets 함수를 통해 key 변수를 오버플로우시켜야할 것 같습니다.
gdb(pwndbg)를 통해 스택을 확인해보겠습니다.
gdb로 main 함수와 func 함수를 디스어셈블링하였습니다.
main 함수에서 볼 것은 esp 값에 0xdeadbeef 값을 넘겨주는 것 말고는 딱히 없네요.
그럼 main 함수에 breakpoint를 걸고 하나하나 넘기며 살펴보겠습니다.
만약 실행을 시켰는데 허가 거부가 나온다면 실행 권한을 추가해줘야 합니다.
chmod +x bof 명령어를 통해 bof 파일에 실행 권한을 추가시켜주세요. (gdb 말고 터미널에서 실행해주세요)
main에 breakpoint를 걸고 ni(어셈블리어 코드를 하나하나 넘기는 명령어) 를 통해 func 호출 직전까지 내려왔습니다.
함수 안으로 직접 들어가는 명령어는 si 명령어입니다. func 함수로 진입하겠습니다.
func 내의 명령어를 살펴볼 수 있습니다. 제일 중요한 부분은 puts 를 통해 overflow me : 를 출력한 뒤, gets 명령어를 통해 입력값을 받아오는 부분입니다. 이 부분까지 내려가보겠습니다.
제가 처음 분석할때는 gets 함수까지 들어가서 처리 과정을 하나하나 분석했었는데 지금 보니 헛걸음이었습니다. 단순히 아래 cmp 명령어만 잘 분석하면 되는 문제였습니다. 그럼 넘어가도록 하죠.
ni 를 누르면 gets 함수가 실행되어 asdfasdfasdf 를 입력해보았습니다. 그 후 명령어는 ebp + 8 과 0xcafebabe 를 비교하는 부분이니 if 문 같은 역할을 하겠네요. 이 부분을 오버플로우해야하니 일단 ebp + 8 을 확인해보겠습니다.
예상대로 deadbeef 값을 가지고 있습니다.
그러면 0xffffd290 값을 변조해야 공격에 성공할 것 같습니다.
여기서 스택 값을 보면 0xffffd240 위치가 입력한 0xffffd25c 를 가리키고 있고, 이 위치는 asdfasdfasdf 를 가리키고 있습니다.
즉, asdfasdfasdf 는 0xffffd25c 에 위치합니다. 0xffffd290 - 0xffffd25c 만큼 더미 값으로 덮어씌워야 deadbeef 값을 변조할 수 있습니다.
0xffffd290 - 0xffffd25c 는 52라고 나오네요. 즉 52 바이트 만큼 더미 값을 뒤집어씌우고, 그 뒤부터 변조값, 즉 0xcafebabe 가 들어가야 합니다. 다만 리틀 이디언 방식을 적용해야 하니 \xbe\xba\xfe\xca 가 들어가야 하겠네요.
즉 입력해야하는 값은 "A" * 52 + "\xbe\xba\xfe\xca" 가 들어가야 합니다.
하지만 답은 구했지만 어떻게 입력해아 할 지 몰라 찾아보던 도중 코드를 입력하고 netcat으로 바로 넘기는 방식으로 구성해야 한다는 것을 알게 되었습니다.
이런 식으로 python -c 를 통해 입력값을 구성하고 동시에 오른쪽에 netcat 명령어를 입력하면 nc로 접속하는 동시에 왼쪽의 python -c print 값이 들어간다고 합니다. 그렇게 한다면 입력상태가 되는데 쉘을 입력할 수 있게 되는 것입니다.
ls 명령어를 입력하니 디렉토리 내의 값이 나옵니다. cat flag 를 통해 플래그를 읽어오면 되겠네요.
flag : daddy, I just pwned a buFFer :)
'정보보안 공부 > Pwnable.kr' 카테고리의 다른 글
Pwnable.kr - collision 문제풀이 (0) | 2020.06.06 |
---|---|
Pwnable.kr - fd 문제풀이 (0) | 2020.06.02 |