https://pwnable.kr bof 문제 풀이

 

 

 

 

위와 같이 wget 명령어를 사용하면 해당 파일을 가상머신에서 바로 다운로드 받을 수 있다.

 

 

다운받은 파일에 실행 권한을 준 후 실행시켜 보고 아무런 내용을 입력하면 위와 같은 결과가 나왔다.

특정 크기가 넘어가면 오버플로우가 일어나 프로그램이 중지되고 종료되는 것을 확인할 수 있었다.

 

다음으로 코드의 내용을 살펴보자.

 

 

메인 함수를 보면 0xdeadbeef를 인자로 갖는 func() 함수를 호출하고 있고

func() 함수를 보면 크기가 32인 overflowme를 선언한 후 gets() 함수를 통해 키값을 확인해 주고 있다.

여기서 인자로 받아온 key와 0xcafebabe를 비교한 값이 같게 만들어 주어야 한다.

이때 크기를 따로 검사하지 않아 overflowme에 할당된 크기를 초과하여 입력할 수 있는 gets() 함수의

취약점을 이용하여 공격을 진행할 것이다.

 

이제 함수를 확인하기 위해 gdb를 이용해보자.

 

 

disas func 명령어를 통해 코드를 확인해보면 CALL 명령어가 사용된 함수 호출 부분을 확인할 수 있다.

lea 명령어를 통해 ebp-0x2c 부분이 버퍼(overflowme)의 시작 주소라는 것을 알 수 있다.

또한, cmp 명령어(if문)의 주소가 40만큼 떨어져 있는 것을 확인할 수 있다.

 

 

따라서 위와 같이 func에 40을 더해준 주소값에 breakpoint를 걸어준 후 실행을 한다.

 

 

위와 같이 해당 cmp 부분에 bp가 잘 걸린 것을 확인할 수 있다.

 

 

또한 esp 값을 확인해 보면 위와 같고, aaaaa를 입력했었기 때문에 61이라는 수가 5번 들어가 있는 것을 확인할 수 있다.

이 때 deadbeef의 주소는 0xffffd010이고, 버퍼의 시작 주소는 0xffffcfdc이다.  

 

 

위의 두 값을 뺀 값을 통해 주소 사이의 거리를 알 수 있고, 이때 p 명령어를 사용한다.

결과값은 0x34로 52만큼 떨어져 있다는 것을 확인할 수 있다.

 

다음으로는 pwntools를 사용하여 공격을 하는 코드를 작성해보자.

 

 

아까 문제 코드에서 key 값을 0xcafebabe와 같게 해주어야 했기 때문에

위에서 구한 거리값인 52에 리틀 엔디안 방식으로 더해 payload를 전달해준다.

 

 

파일 저장 후 python 명령어로 실행시켜 보면 위와 같이 잘 실행되는 것을 확인할 수 있다.

 

 

ls를 해보았더니 flag 파일이 있었고, cat 명령어를 통해 위와 같이 flag를 알아낼 수 있었다.

 

'2021-1 STUDY > Pwnable Study' 카테고리의 다른 글

Week06_프로세스4  (0) 2021.08.28
Week05_basic_exploitation_001  (0) 2021.05.19
Week04_GDB 분석  (0) 2021.05.12
Week03_collision  (0) 2021.05.05
Week03_setuid  (0) 2021.05.05

+ Recent posts