▶ 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 |