# BackdoorCTF 2023

## 1: Rev/baby eBPF

Đầu tiên kiểm tra file ta nhận được đây là file eBDF

<figure><img src="/files/nErXY4uBj1rKMIYMj9wD" alt=""><figcaption></figcaption></figure>

Như cả mô tả của bài cũng có nói là có liên quan đến eBDF. Do đó ta sẽ đi tìm công cụ hỗ trợ việc đọc để hiểu xem bài này sẽ được xử lý như nào. Sau 1 lúc tìm thì tìm được `llvm-objdump` là hiển thị ra code đọc hiểu được như sau:

<figure><img src="/files/1RkusIGJqV4CzDQ93bZe" alt=""><figcaption></figcaption></figure>

Lúc đầu tôi làm thế này thì thấy thuật toán baby này chỉ là XOR lần lượt 28 ký tự của mảng `r10` và `u8`, `r10` thì đã được khai báo giá trị ở phần trên kia còn `u8` thì tôi không thấy nó ở đâu cả.

Tôi đi kiếm thì thấy data trong .rodata có đoạn giống:

<figure><img src="/files/29hiKpAOpfVDV3OEn4WZ" alt=""><figcaption></figcaption></figure>

hoặc là:

<figure><img src="/files/lmKvCgAOw0EYrC066ymS" alt=""><figcaption></figcaption></figure>

Tôi thấy nghi chuỗi kia, kiểm tra thì đúng chuỗi đó cũng 28 ký tự -> có thể khẳng định u8 là chuỗi đầu kia. Và chạy thì ra flag thật:

```python
r10 = [0x0B, 0x0D, 0x13, 0x0E, 0x15, 0x5A, 0x07, 0x43, 0x13, 0x57, 0x3E, 0x40, 0x51, 0x32, 0x52, 0x10, 0x19, 0x08, 0x34, 0x01, 0x47, 0x09, 0x54, 0x09, 0x44, 0x04, 0x05, 0x1C]
u8 = "marinkitagawamarinkitagawama"
for i in range(len(lst)):
    print(chr(lst1[i]^ord(str1[i])),end="")
# flag{1n7r0_70_3bpf_h3h3h3eh}
```

Tôi đi kiểm tra lại xem có câu lệnh nào có thể hiển thị được ra `u8` hay không và tôi nhận được:

Sử dụng câu lệnh kiểm tra tất cả các header:

<figure><img src="/files/w4R7OkiJRhzJQ9gK8T6A" alt=""><figcaption></figcaption></figure>

Kết hợp ta được câu lệnh `llvm-objdump -x -d babyebpf.o`:

<figure><img src="/files/kv5bnDTAFYcFWJBC1sKq" alt=""><figcaption></figcaption></figure>

Và kiểm tra 2 phần đó thì ta có kết quả sau:

<figure><img src="/files/VdmuwJELIfyF7ZCsymBh" alt=""><figcaption></figcaption></figure>

Như vậy đã quá rõ ràng với bài này rồi.

## 2: Rev/Sl4ydroid

Chạy chương trình ta nhận được một màn hình hiển thị chỉ 1 chuỗi không có gì khác:

<figure><img src="/files/cEwERRgNmc4s6sZ2MCXT" alt=""><figcaption></figcaption></figure>

Hàm main của chương trình:

<figure><img src="/files/9nr2JCsho2JTgcoVDPPY" alt=""><figcaption></figcaption></figure>

Giá trị mà các chuỗi nghi ngờ: (nó nằm trong R)

<figure><img src="/files/EnGZpfT4qkzeeJvKtvC7" alt=""><figcaption></figcaption></figure>

Tôi đang không hiểu tại sao là nó không thấy gọi gì để chạy ra thì tôi nhớ ra trước là có sử dụng thư viện .so thì tôi kiểm tra là có thật:

<figure><img src="/files/U8yEq6UGgnVHplynEag9" alt=""><figcaption></figcaption></figure>

Chạy kiểm tra và xem qua thì chưa chắc chắn sẽ kiểm tra hàm nào với nó, nên tôi tìm hiểu thì họ bảo qua Android Studio xem log tổng quát xem thế nào thì ra nhận được cái mà mình chờ luôn.&#x20;

Đang kiếm xem có liên kết gì giữa việc gọi các hàm trong thư viện .so thì nhận được log là như sau thì đúng là flag:

<figure><img src="/files/OjSTKM1TrHfoIbRUlOyr" alt=""><figcaption></figcaption></figure>

## 3: Beginner/Fruit Basket

Đối với bài này thì được cái biết vận dụng và sử dụng việc send payload bằng số ngẫu nhiên có seed bằng thời gian thực tại. Dưới đây là đoạn code sử dụng để ra số ngẫu nhiên đó:

```python
import math
from ctypes import CDLL
from pwn import *
import time

def get_Random():
        return libc.rand()

libc = CDLL('libc.so.6')
now = int(math.floor(time.time()))
libc.srand(now)
num = get_Random()
```

Và dưới là đoạn code của team tôi: (do máy tôi lỗi cái phần load thư viện nên tôi dừng lại tại đó)

```python
import math
from ctypes import CDLL
from pwn import *
import time
def get_Random():
        return libc.rand()
libc = CDLL('libc.so.6')
a = [
        "Apple",
        "Orange",
        "Mango",
        "Banana",
        "Pineapple",
        "Watermelon",
        "Guava",
        "Kiwi",
        "Strawberry",
        "Peach"
    ]
p = remote('34.70.212.151',8006)
now = int(math.floor(time.time()))
libc.srand(now)
#p.recvuntil('Your guess : ')
for i in range(50):
        p.recvuntil('Your guess : ')
        p.sendline(str(a[get_Random() % 10]))
        time.sleep(1)
    #print(str(a[get_Random() % 10]))

#p.recvline()
p.interactive()
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://viettaliii.gitbook.io/home/ctf/write-up/backdoorctf-2023.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
