꿈이 너무 많은 한 대학생의 공간

Pwnable.kr - bof 문제풀이 본문

정보보안 공부/Pwnable.kr

Pwnable.kr - bof 문제풀이

청울울청 2020. 6. 9. 11:17

드디어 시스템 해킹의 첫 관문인 버퍼오버플로우 문제를 풀어보겠습니다.

푸는 방법은 이해했지만 포너블에 아직 익숙치 않아 어떻게 쉘코드를 입력해야 하는지 고민 끝내 풀이를 보고 찾아냈습니다..

할머니께서 버퍼 오버플로우는 제일 일반적인 소프트웨어 취약점이라 하셨어. 그게 진짜일까?

먼저 실행파일과 소스코드를 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
Comments