system hacking

Layer7 포너블 1차시 과제 - bof_basic_64

leesu0605 2022. 9. 14. 18:30

일단 파일을 다운받고 ida64로 열어보았다.

scanf를 쓰는 것을 보아 버퍼 오버플로우인 것을 알 수 있었다.
그런데 문제점이 있다.
바로 오버플로우시킬 변수가 따로 없다는 것이다.

따라서 우리는 main함수의 리턴 주소를 변조해 기존 rip를 바꿔 main함수를 리턴할 때 완전히 다른 코드가 실행될 수 있도록 해주어야 한다.
그러기 위해서 일단 쉘코드를 실행시키는 함수를 찾아보았다.

callMeMaybe라는 함수가 쉘을 실행시키고 있었다.
그리고 callMeMaybe의 주소는

0x400606이라는 것도 알아냈고, 따라서 우리에게 남은 것은 s버퍼부터 리턴 주소 사이의 거리를 계산하는 것이다.

일단,

이 두가지 정보로 s가 ebp-0x110에 저장돼있다는 걸 알 수 있고, 64비트이므로 sfp가 8바이트가 되어 리턴 주소와 s 버퍼 사이의 거리는 0x118이다.

이제, 익스플로잇 코드를 짜보자.

from pwn import *

p = remote("pwn.scalart.me", 8003)

p.send(b'A'*0x118+p64(0x400606))
p.interactive()

이렇게 짜서 s버퍼와 리턴 주소 사이를 모두 채우고, callMeMaybe의 주소를 p64로 인코드해 넣어주면 쉘을 따낼 수 있다.

그 후, 전 문제들처럼 /home/bof_basic_64로 이동해 flag를 읽어주면 플래그가 나온다.

flag : L7{9dd1fb9a1da2c1dd7afaa221e21b3e20}