<h1>Hack The Box - Reversing (Medium Part 4)</h1>

Ghi chú:
<ul>
<li>Hard: 19-20 challenge</li>
<ul>
<li><a href="#BioBundle">19. BioBundle</a></li>
<li><a href="#RiseFromTheDead">20. RiseFromTheDead</a></li>
</ul>
</li>
</ul>
<h2>Difficulty: Medium </h2>
<div id="BioBundle"></div>
<h3>Challenge 19: BioBundle</h3>
We've obtained a sample of zombie DNA. Can you extract and decrypt their genetic code - we believe we can use it to create a cure...
<a href="https://drive.google.com/file/d/1RvgzAg8pYfuHKko5UFERzzBwRVlLO2q0/view?usp=sharing">Download Challenge Here</a>
<h3>Solution</h3>
Chúng ta có thể sử dụng lệnh 'file' để cung cấp cái nhìn tổng quan về loại tệp.

Mở file trong IDA

Hàm `get_handle()` tạo ` shared object handle` dùng `dynamic loading`. Hàm `memfd_create` là một cuộc gọi hệ thống Linux được sử dụng để tạo một tệp ẩn danh và trả về một mô tả tập tin tham chiếu đến nó.
Bên trong vòng lặp, nó thực hiện phép XOR giữa mỗi byte từ mảng _ với 0x37 và ghi kết quả vào mô tả file bộ nhớ fd. Tạo một chuỗi s chứa đường dẫn đến mô tả file bằng cách sử dụng sprintf với định dạng `/proc/self/fd/%d`, trong đó %d được thay thế bằng mô tả file fd.

Hàm `dlsym()` nhận dynamic loaded shared object handle, lấy địa chỉ con trỏ của một hàm hay một biến trong thư viện được tải động.
Ta có thể viết một đoạn IDAPython để patch byte và lấy các byte đó sửa trong HxD và nhận được file ELF. Hoặc bạn có thể debug chương trình vì nó cũng sẽ được load.
:::info
```
import ida_bytes
base_address = 0x4080
for i in range(0x3E08):
tmp = ida_bytes.get_byte(address+i)
ida_bytes.patch_byte(address+i,tmp ^ 0x37)
```
:::
Mở tệp mới trong IDA

:::success
```
Flag: HTB{st4t1c_l1b5_but_c00l3r}
```
:::
<div id="RiseFromTheDead"></div>
<h3>Challenge 20: RiseFromTheDead</h3>
One of our greatest scientists died recently, but we need them to cure the zombie virus. Can you raise them from the dead and get the help we need?
<a href="https://drive.google.com/file/d/1RvgzAg8pYfuHKko5UFERzzBwRVlLO2q0/view?usp=sharing">Download Challenge Here</a>
<h3>Solution</h3>
Chúng ta có thể sử dụng lệnh 'file' để cung cấp cái nhìn tổng quan về loại tệp.

Tệp `core` được tạo khi chạy lệnh `./rise flag` trên một máy tính 64-bit. Mở chương trình trong IDA.

Chương trình sẽ mở một file nào đó và ánh xạ 4096 byte của tệp đó vào bộ nhớ sử dụng hàm mmap. Sau đó, con trỏ `vùng nhớ ánh xạ v5` được chuyển đổi thành `một số nguyên 64-bit v6`. Nếu việc ánh xạ bộ nhớ thành công (nghĩa là v5 không phải là NULL), chương trình sẽ gọi hai hàm `shuf` và `init_shuffle_list` trên vùng nhớ đã ánh xạ. Các hàm này có thể được sử dụng để khởi tạo và xử lý dữ liệu trong vùng nhớ đó.
Ta tạo Struct cho danh sách liên kết như sau
:::info
```c
struct node
{
struct node *next;
unsigned __int8 pos;
char chr;
};
```
:::

Hàm `init_shuffle_list()` lần lượt duyệt qua từng ký tự của flag.Nó tạo ra một số nguyên ngẫu nhiên có kích thước 1 byte từ `/dev/urandom`. Nếu số này chưa xuất hiện, nó thêm số này và ký tự hiện tại của flag vào list.

Hàm `pos_in_list()` kiểm tra các byte ngẫu nhiên đã thu được từ `buf` có trong v6 chưa.

Nếu chưa `append_list` sẽ thêm vào cuối mảng `v6`.

Trong hàm `shuf()` , đối với mỗi phần tử của linked list, ta gán buf[pos] cho chr trước khi duyệt đến node tiếp theo.
`core file` là một bản chụp của trạng thái bộ nhớ của một tiến trình tại thời điểm nó kết thúc không đúng cách. Khi một chương trình gặp lỗi và kết thúc không mong muốn, hệ điều hành thường tạo ra một core file để ghi lại trạng thái của bộ nhớ và các thông tin khác liên quan đến tiến trình tại thời điểm lỗi xảy ra.
Nếu một danh sách liên kết vẫn còn tồn tại trong bộ nhớ tại thời điểm chương trình bị crash và được lưu trong core file, bạn có thể phân tích core file để trích xuất thông tin về các nút trong danh sách đó. Ta dùng `core.mappings` để lấy thông tin về ánh xạ (mapping) các vùng nhớ của tiến trình tại thời điểm core được tạo ra.
Mình ít khi phân tích `core file` nên sau khi tìm kiếm, mình sẽ viết chương trình theo <a href="https://lief-project.github.io/doc/latest/tutorials/12_elf_coredump.html">ELF Coredump</a>.
Ta có thể mở `core file` với đoạn lệnh sau. Ta nhận được kết quả trả về là các Note, trong số đó có `CORE_FILE` - `các ãnh xạ vào vùng nhớ của chương trình`.
:::info
```python
import lief
core = lief.parse("core")
```
:::

:::info
```python
from pwn import *
core = Corefile("./core")
heap = next(mem for mem in core.mappings if mem.name == '')
flag = next(mem for mem in core.mappings if 'flag' in mem.name)
shuffled_flag = core.read(flag.start, flag.size).replace(b'\x00', b'')
list_head = None
for addr in range(heap.start, heap.stop, 16):
data = core.read(addr, 16)
ptr, pos, char = struct.unpack("PBB", data[:10])
if ptr in heap and pos != 0 and char == 0:
list_head = addr
break
flag = ""
while list_head:
data = core.read(list_head, 9)
ptr, pos = struct.unpack("PB", data)
flag += chr(shuffled_flag[pos])
list_head = ptr
print(flag)
```
:::
:::success
```
Flag: HTB{by_the_powers_of_https://man7.org/linux/man-pages/man5/core.5.html_i_resurrect_this_process_from_the_dead-reveal_your_secrets_to_me!228da2f265e1f3c3c8f4b777600611e822649a}
```
:::