이번 문제는 FTZ 문제풀이를 하면서 가장 많이 다뤘던 BOF 문제이다.
먼저 다운로드 받으라고 나와있는 파일을 다운로드 받았다.
wget 명령어는 웹브라우저에서 파일을 다운받기 위한 명령어이다.
파일이 다운로드 된 것을 보고, 권한을 확인했다.
두 파일 모두 읽기만 가능하고 실행은 할 수 없다.
이렇게 되면 페이로드를 작성해서 실행하는 방법이 없지만
문제에 보면 nc pwnable.kr 9000으로 bof에 nc를 걸어놓았을 것을 짐작할 수 있다.
먼저 bof.c 파일을 읽어보면 func와 main 함수가 정의되어 있다.
main 함수에서 func에 key 인자로 0dbeadbeef를 넘겨준다.
func 함수에서는 overflowme를 32byte 만큼 정의하였고 get 함수에서 입력같을 받아온다.
get 함수가 얼마나 가져올지에 대한 제한을 두지 않았기 때문에 BOF 취약점을 가지고 있다.
if 문에서 key의 값과 0xcafebabd가 일치하는 것을 확인하고
일치하면 쉘을 실행하고 일치하지 않으면 문장을 출력한다.
main에서 func 함수가 호출되는 주소는 0x0000069a이다.
func 함수에서 gets 함수가 호출되는 주소는 0x0000064f이다.
ebp + 0x8과 cafebabe의 값을 비교하기 때문에 저 위치에 key 값이 존재하는 것을 알 수 있다.
overflowm에 문자를 입력해 key 값을 써서 페이로드를 완성해야 한다.
[ 페이로드 ]
overflowme ( 32byte ) + dummy ( 20 byte ) + 0xcafebabe의 주소값
"A" * 52 + "\xbe\xba\xfe\xca"
페이로드 입력 후에 ls 명령어로 내가 cat 할 수 있는 파일에 flag가 있는지 확인했고,
cat 하여 flag를 얻을 수 있었다.