HUU TRI NGUYEN

@JohnathanHuuTri

Joined on Nov 17, 2022

  • Braggart Đây là một challenge pwn x web khá thú vị. Chúng ta được cung cấp một link và khi bấm vào link đó sẽ hiện như sau: Click vào backup sẽ cho ta một binary. Decompile file binary đó thì ta biết được nó là thành phần back-end xử lý gói tin request tới khi ta xem hàm printMain: Chương trình thực thi khá nhiều hàm getenv nhưng ta thấy có một vài hàm lấy chuỗi bắt đầu với HTTP_, đây có thể được xem là header của gói tin request. Do đó ta sẽ dùng burpsuite để có thể thêm bớt một cách dễ dàng. Sau một hồi tìm kiếm bug, ta thấy trong hàm printDebugInfo có lỗi Buffer Overflow khi thực hiện strcpy với dữ liệu là User-Agent: Biến dest nằm ngay trên biến format, do đó nếu nó overflow, ta hoàn toàn có thể thay đổi format của biến format để thực thi format tùy ý --> Format String. Để tìm offset phù hợp, ta sẽ cùng debug chương trình này và thiết lập các biến môi trường phù hợp để có thể đi vào hàm printDebugInfo của printMain:
     Like  Bookmark
  • Hôm nay chúng ta sẽ cùng tìm hiểu về scapy và cách sử dụng scapy và netfilterqueue để tạo một con firewall vui vui. Việc cài đặt và chạy sẽ được tiến hành trên ubuntu 20.04 brandnew. Scapy là một thư viện của python hỗ trợ việc decode, điều chỉnh, làm giả các gói tin và nhiều hơn thế nữa. Việc cài đặt scapy cũng khá là đơn giải khi nó đã là thư viện của python: sudo python3 -m pip install scapy Ta sẽ cài scapy với quyền root vì scapy cần quyền root mới có thể chạy được:
     Like 1 Bookmark
  • Just by looking at the decompiler, we can see that it will execute user input as shellcode with some seccomp: Check seccomp with seccomp-tools, we know that the binary only allow open, read and write: The first loop after read is to make sure that all bytes of shellcode is an odd number: On the second loop, it check to make sure that all bytes of shellcode just has maximum 20 different bytes. If there are more, the program will exit: So it's just a shellcode challenge with some constraints. Let's move on!
     Like  Bookmark
  • ptrace là một công cụ điều khiển luồng thực thi của một tiến trình. Ta có thể xem và thay đổi dữ liệu trên các phân vùng memory, đặc biệt là cho phép ghi luôn phân vùng chỉ đọc (tương tự như thay đổi bằng cách ghi vào /proc/<pid>/mem). Ngoài ra ptrace còn cho phép chúng ta xem và thay đổi dữ liệu trên các thanh ghi. Bạn có biết: ptrace cũng được dùng để debug trong GDB Cấu trúc lệnh: #include <sys/ptrace.h> long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); Có nhiều request khác nhau để tương tác với tracee (chương trình con bị trace) và chúng ta sẽ tìm hiểu một vài request dưới đây để tương tác với chương trình. Các bạn có thể xem khai báo của các request ở đây để biết được các request sẽ có mã số là bao nhiêu để code assembly.
     Like  Bookmark
  • Tuần này, chúng ta sẽ cùng tìm hiểu cách phân tích cũng như giả lập một firmware để khai thác firmware đó. Công cụ FirmAE Đây là công cụ dùng để emulate firmware mà mình thấy là oke nhất. Công cụ này base từ Firmadyne và có công cụ khác cũng base từ Firmadyne đó là Firmware Analyziz Toolkit. Hiện tại cái repo của binwalk nó bị lỗi nên việc cài đặt bình thường sẽ thiếu dependencies. Các bạn có thể tải FirmAE từ repo của mình ở đây vì mình đã patch các file cài đặt. Để build và check 1 firmware, ta chạy lệnh sau:
     Like  Bookmark
  • Các vùng nhớ của tiến trình /proc/$pid/maps Khi một tiến trình đang chạy, ta hoàn toàn có thể xem được tiến trình đó tạo các trang nhớ tại địa chỉ nào bằng cách đọc dữ liệu của file /proc/$pid/maps. Giả sử ta chạy một chương trình có tên youwantmetorunwhat và số pid của tiến trình này là 303: Là người dùng JHT giống với user của tiến trình, ta chỉ việc đọc file /proc/303/maps là có thể biết được chương trình đã tạo ra các phân vùng nào và địa chỉ của các phân vùng đó: Dữ liệu vẫn còn nhưng vì dài quá nên mình chỉ lấy phần đầu. Nếu ta xem bằng gdb thì các địa chỉ này là hoàn toàn giống nhau: /proc/$pid/mem Bạn có bao giờ thắc mắc tại sao GDB lại có thể in ra dữ liệu của các trang nhớ đó không? Theo mình nghĩ là nó sẽ lấy dữ liệu từ file /proc/$pid/mem để in ra và đây là file đọc và ghi được.
     Like  Bookmark
  • Giải trên pwnable.kr Kiến thức mới: Nếu ta thực thi ulimit -s unlimited thì mình hoàn toàn có thể thay đổi địa chỉ stack thành bất kỳ địa chỉ nào và thực thi push sẽ không gây lỗi. Giả sử với đoạn code 32bit sau: section .text global _start _start: mov esp, 0x87654321 push eax Nếu ta compile với những lệnh sau:
     Like  Bookmark