Skip to main content

Posts

Showing posts from 2023

24 ngày học Rust - ngày 11 for loop borrow

for sẽ move value Khi lặp qua từng phần tử của v với for i in v , v bị move ownership cho vòng for loop, nên ở lần lặp thứ 2 không còn v nữa, Rust compiler báo lỗi. Thấy thêm rằng khi người dùng viết for i in v thì code thực sự được chạy là for i in v.into_iter() fn main() { let v = vec![10,20,30,40]; for i in v { println!("{}", i); } for i in v { println!("{}", i); } } Output error[E0382]: use of moved value: `v` --> src/main.rs:6:14 | 2 | let v = vec![10,20,30,40]; | - move occurs because `v` has type `Vec<i32>`, which does not implement the `Copy` trait 3 | for i in v { | - `v` moved due to this implicit call to `.into_iter()` ... 6 | for i in v { | ^ value used here after move | note: `into_iter` takes ownership of the receiver `self`, which moves `v` --> /rustc/84c898d65adf2f39a5a98507f1fe0ce10a2b8dbc/library/core/src/iter/traits/collect.rs:262:18 h...

Máy không có IPv6, ai query DNS record AAAA?

Đa phần các máy tính vào cuối 2023 đều đã sử dụng IPv6, đặc biệt là các Linux server. Nhưng khi đã tắt IPv6, disable qua sysctl: # sysctl -w net.ipv6.conf.all.disable_ipv6=1 bật tcpdump vẫn thấy các ứng dụng query AAAA record (lấy địa chỉ IPv6 tương ứng với domain), tại sao? Thí nghiệm Mở 1 cửa sổ chạy tcpdump port 53: root@box:~# tcpdump port 53 tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes ... Mở cửa sổ khác, bật Python3, import socket và gọi các function để lấy địa chỉ IP từ tên miền: >>> import socket >>> socket.gethostbyname("pymi.vn") '104.21.61.168' >>> socket.gethostbyname("pymi.vn") '172.67.212.45' >>> socket.getaddrinfo("familug.org") Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: getaddrinfo() missing 1 required positional a...

24 ngày học Rust - ngày 2 set

Kiểu set chỉ chứa mỗi phần tử 1 lần duy nhất, loại bỏ các phần tử trùng lặp. Ví dụ sau chỉ thấy có 1 số 1 . HashSet - kiểu dữ liệu set Rust có sẵn kiểu set có tên HashSet, cần phải import từ thư viện "collections" use std::collections::HashSet; pub fn main() { let mut s = HashSet::new(); s.insert(1); s.insert(2); s.insert(3); s.insert(1); dbg!(&s); } //[src/main.rs:8] &s = { // 2, // 1, // 3, //} Kiểu set không có thứ tự của các phần tử, kết quả print có thể khác ví dụ trên và khác ở mỗi lần chạy code. Tạo set từ vector, iterator let cs = "abcddcba".chars(); let s1: HashSet<char> = HashSet::from_iter(cs); dbg!(s1); // s1 = { // 'd', // 'a', // 'c', // 'b', //} let v = vec![1, 2, 3, 1]; let s2: HashSet<i64> = HashSet::from_iter(v); dbg!(s2); // s2 = { // 3, // 1, // 2, //} HashSet có đủ mọi method cho set Như Python, Rust HashSet có đủ các method u...

24 ngày học Rust - ngày 1 String

Loạt bài viết giới thiệu các khái niệm trong Rust. Không quá chi tiết, đa phần ngắn gọn, mục tiêu trong 24 ngày. PS: Là note khi giải https://adventofcode.com Cài đặt & chạy code Tham khảo https://pp.pymi.vn/article/aoc2021/ Bài viết sử dụng Rust 2021 . String, &str Rust có 2 kiểu string thường dùng là str và String. str - string slice str còn được gọi là string slice , thường được dùng ở dạng "borrowed" &str . Kiểu của các string khi viết trực tiếp vào code (literal string) là &str . str dùng double quote " để bao quanh nội dung: let s: &str = "Hello, world!"; String String là một UTF-8 string có thể thay đổi. A UTF-8–encoded, growable string. String làm chủ sở hữu giá trị của nó nên còn gọi là owned string - trái với &str là borrowed (đi mượn). let s: String = String::from("Hello, world!"); dbg!(s); // [src/main.rs:6] s = "Hello, world!" Thêm (append) vào String với push(char) hay push_str...

Tạo và code Python tương tác với Kubernetes trên local dùng k3s

Kubernetes vốn mang tiếng phức tạp, lằng nhằng, và không ai phải đối chuyện này... không phản đối nhưng vẫn sinh ra 1 phiên bản Kubernetes nhỏ nhẹ hơn có thể chạy trên cả thiết bị Raspberry Pi tí hon, đó là K3S. K8S - 5 == K3S Trang chủ: https://k3s.io/ The certified Kubernetes distribution built for IoT & Edge computing K3S rất nhẹ, chỉ 1 binary < 80MB, chạy tốn ít tài nguyên: root 842 5.8 12.8 1344004 514540 ? Ssl 14:30 1:25 /usr/local/bin/k3s server Ví dụ chạy trên máy ảo hết 500MB RAM và chiếm 5% CPU. (đang chạy 2 pod 1 NGINX 1 redis). Ngoài k3s, có nhiều sản phẩm khác tương tự như minikube, hay microk8s. Cài đặt curl -sfL https://get.k3s.io | sh - # Check for Ready node, takes ~30 seconds sudo k3s kubectl get node ngay sau khi kết thúc câu lệnh trên, gõ xem cluster đang chạy: # kubectl get nodes NAME STATUS ROLES AGE VERSION bullseye Ready control-plane,master 29m v1.27.7+k3s2 k3s chạy cả master lẫn "...

Tại sao CA ok trên Chrome còn Firefox báo không hợp lệ

Trên MacOS, nếu một trang web nội bộ khi vào bằng Chrome thì bình thường, còn Firefox báo private certificate authorities không hợp lệ (CA không hợp lệ), tại sao? Mặc định không giống nhau Chrome (119) mặc định lấy CA từ Apple keystore, và Macbook được cài sẵn các CA của công ty. Firefox mặc định set security.enterprise_roots.enabled = false cần vào trang about:config rồi tìm và set option này thành 1. https://support.mozilla.org/en-US/kb/setting-certificate-authorities-firefox Hết. HVN at http://pymi.vn and https://www.familug.org . Ủng hộ tác giả 🍺

Học khai thác lỗ hổng bảo mật qua ROP Emporium - Part 2

Bad chars Challenge 5 cũng tương tự challenge 4 Write 4 nhưng chuỗi khi truyền vào sẽ được kiểm tra các ký tự, nếu gặp các ký tự này sẽ bị thay thế bằng 0xeb Như vậy ta cần tránh các ký tự 4 kí tự là “x”,  “g”, “a” ,“.” Và để tránh truyền các ký tự này ta sẽ truyền vào string “flag.txt” đã được encrypt từng byte bằng phép xor với 0x50 (chọn key để tránh các kí tự trên) và sử dụnng gadget xor để decrypt trước khi thực thi  Tiến hành lấy địa chỉ các gadget cần thiết  $ rabin2 -i badchars [Imports] nth vaddr bind type lib name ――――――――――――――――――――――――――――――――――――― ... 4 0x00400510 GLOBAL FUNC print_file $ rabin2 -S badchars [Sections] nth paddr size vaddr vsize perm name ――――――――――――――――――――――――――――――――――――――――――――――――― 23 0x00001028 0x10 0x00601028 0x10 -rw- .data $ python3 Ropper.py -f badchars ... 0x000000000040069c: pop r12; pop r13; pop r14; pop r15; ret; 0x00000000004006a3: pop rdi; ret; 0x00000000004004ee: ret; 0x0000000000400628: xor byt...

Học khai thác lỗ hổng bảo mật qua ROP Emporium

ROP Emporium ROP Emporium là chuỗi challenge dùng để hướng dẫn cách xây dựng exploit (ROP gadget bypass NX - NonExecute) dành cho newbie, cụ thể là tự build rop gadgets.  Trước khi bắt đầu cần lưu ý một số thứ:  Lab được sử dụng ở đây là x64_86, với các kiến trúc khác việc xây dựng rop gadget sẽ khác nhau Số lượng offset cần để smashstack và ghi đè địa trỉ trở về trong binary x86 là 40, do đó ta sẽ thêm 40 bytes “A” để ghi đè địa chỉ trả về. Lab cần vô hiệu hóa ASLR, ASLR sẽ khiến cho địa chỉ của binary trong bộ nhớ được phân bổ ngẫu nhiên khiến các địa chỉ trong gadget không chính xác (Cần lỗ hổng để leak base address và cộng thêm vào) Công cụ sử dụng chủ yếu gồm: Ghidra (RE), rabin2, radare2, Ropper, pwndbg. Cấu trúc stack sẽ biễu diễn từ thấp đến cao [] -> thấp .... [] -> cao push rdi; sẽ thêm giá trị rdi vào stack và thanh ghi rsp (stack pointer) sẽ giảm pop rdi; sẽ lấy giá trị tại đỉnh stack nơi rsp trỏ vào và giá trị rsp sẽ tăng mov [rsi], rdi; sẽ lấy giá trị r...

Truy cập website chỉ với TCP socket - Python, Perl, Bash

Thời đại ngày nay khi mọi ngôn ngữ lập trình đều có sẵn hay dễ dàng cài thư viện HTTP client, HTTP dần trở thành "hộp đen" ít người thọc vào táy máy. Chỉ có 1 TCP socket, liệu có kết nối HTTP được không? let's do it CHÚ Ý: HTTP, không phải HTTPS HTTP/1.1 protocol Truy cập: HTTP/1.0 hay HTTP/1.1 là protocol (giao thức) dùng text, chỉ cần gửi các string đi là nhận được response. Cấu trúc 1 HTTP/1.x request: CRLF là Carriage Return and Line Feed \r\n HTTP request format Method Request-URI HTTP-Version CRLF headers CRLF message-body Chạy HTTP server có sẵn ở python3 $ python3 -m http.server Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... 127.0.0.1 - - [31/Aug/2023 19:06:49] "GET / HTTP/1.1" 200 - Gửi HTTP request bằng lệnh nc (netcat) $ nc localhost 8000 GET / HTTP/1.1 header1=value HTTP/1.0 200 OK Server: SimpleHTTP/0.6 Python/3.11.3 Date: Thu, 31 Aug 2023 12:06:49 GMT Content-type: text/html; charset=utf-8 Content-Length: 6504 ... Gửi HT...

[Go] nil không là duy nhất, cap(map) = ?

Trong Python, None là giá trị duy nhất thể hiện sự "không có gì", sự "null", thì trong Go, nil lại là nhiều thứ khác nhau. Go nil có kiểu Mỗi giá trị nil có kiểu cụ thể. package main func main() { var s []int var m map[string]int println(s == nil) println(m == nil) // println(x == y) // Compile error: ./nil.go:9:15: invalid operation: s == m (mismatched types []int and map[string]int) } s và m đều bằng nil , nhưng không bằng nhau. nil map không phải là vô dụng var m map[string]int Khi 1 map chưa được khởi tạo, nó có giá trị là nil . Map là kiểu reference , như pointer hay slices. nil map vẫn đọc giá trị bình thường (giá trị là zero value của kiểu int tức 0): var m map[string]int v := m["password"] println(m)// 0x0 println(v)// 0 nil map không thêm được giá trị. var m map[string]int m["age"] = 8 Panic với nội dung panic: assignment to entry in nil map goroutine 1 [running]: main.main() /home/hvn/me/fami...

Viết "Hello World" bằng C, đọc và chạy Assembly x86-64 (phần 1)

Điều đầu tiên và quan trọng nhất khi đọc về C hay assembly là: không được sợ. Code có thể lạ hay dài, nhưng không hề khó, mà thường đơn giản. không yêu cầu biết C không yêu cầu biết assembly biết code đơn giản 1 ngôn ngữ bất kỳ đọc xong là biết. Bài viết liên quan hơi ngược lại với bài viết hello word bằng x86-64 assembly , viết thì khó hơn đọc, bởi viết cần nghĩ đủ thứ, lên kế hoạch viết gì tiếp, đặt tên ra sao, còn đọc thì chỉ cần đi theo. PS: nên đọc trên máy tính hay tablet để có format chuẩn. Cài đặt gcc gdb Trên Ubuntu sudo apt update && sudo apt install -y gcc gdb Viết Hello World bằng C Hơn "hello world" 1 chút, sẽ viết 1 function nhận vào 8 đầu vào và tính tổng. #include <stdio.h> int sum(int a, int b, int c, int d, int e, int f, int g, int h) { int s = a + b + c + d + e + f + g + h; return s; } int main() { puts("Hello world!"); int s = sum(1,2,3,4,5,6,7,8); return s*2; } Dòng include như import trong Pyt...

virt-manager error: Failed to start network default error: Unable to create bridge virbr0: Package not installed

$ sudo virsh net-start default error: Failed to start network default error: Unable to create bridge virbr0: Package not installed Or turn on the VM using virt-manager: Error starting domain: Requested operation is not valid: network 'default' is not active Solution Enable libvirtd to start with the system. systemctl enable libvirtd reboot HVN at http://pymi.vn and https://www.familug.org . Ủng hộ tác giả 🍺

SSD NVMe vs SATA, DisplayPort vs HDMI, USB downstream port

^---- USB Downstream | DisplayPort ----^ SSD NVMe khác gì SSD SATA Solid-state Drive (SSD) là thế hệ ổ cứng mới, không sử dụng đĩa quay như Hard Disk Drive (HDD), SSD tốc độ nhanh gấp 5 tới vài trăm lần so với HDD. SATA là gì Serial ATA (SATA) (~2004) là công nghệ sử dụng AHCI driver giao tiếp với ổ cứng HDD, công nghệ này cũng được dùng với SSD giúp cắm được vào các máy tính đời cũ, nhưng cản trở SSD bung mình bứt phá. Các ổ cứng SATA THƯỜNG có hình chữ nhật giống bao thuốc lá. NVMe là gì Non-Volatile Memory Express (NVMe) (~2011) driver được thiết kế cho SSD, kết hợp sử dụng khe cắm PCIe, cho tốc độ nhanh hơn SATA có thể lên tới 100 lần. Các ổ cứng NVMe THƯỜNG dài thon như 2 ngón tay, hay phong kẹo cao su. $ mount | grep ' on / ' /dev/nvme0n1p1 on / type ext4 (rw,relatime,errors=remount-ro) M.2 2280 vs 2.5 inch NVMe và SATA là các chuẩn giao tiếp, không phải hình dáng của ổ cứng. Hình dáng (form factor) có 2 loại phổ biến: 2.5 inch: hình dáng truyền thống củ...

CPU chạy thread hay process?

Hay những câu hỏi liên quan: Thread và process khác gì nhau? 1 process chạy multithreading trên mấy CPU? Vì sao Java, Rust không nhắc tới multiprocessing? Khi chạy CPU bound, dùng multi-process hay multi-threaded? bài này sẽ làm cho ra nhẽ. Việc khó khăn nhất khi trả lời các câu hỏi này là tìm được các tài liệu có tính "chuẩn mực"/căn cứ, không phải mấy trang tutorial, wikipedia hay hỏi đáp trên mạng. Process là gì, thread là gì Người dùng máy tính thường biết đến khái niệm process trước, nó hiển thị mặc định trên các chương trình process manager như top , hay ps , hay Monitor trên Ubuntu, hay cả Task manager trên Windows. Mỗi process được gán cho 1 số ProcessID (PID), dùng lệnh kill -9 PID để tắt chương trình bị "treo". Khi chạy 1 chương trình, hệ điều hành sẽ tạo ra 1 (hay vài) process. Cho tới khi học lập trình Python, thấy mỗi chương trình chỉ chạy code tuần tự từ trên xuống, nhận ra rằng mỗi 1 process chỉ chạy 1 "luồng" (thread), học t...

ps và top hiển thị số thread

Người dùng Linux hẳn đều biết dùng lệnh ps -ef hay top để xem các "chương trình" đang chạy. Chương trình trên Linux thường ám chỉ 1 (vài) process đang chạy, mỗi process được gắn số ProcessID (PID). Một process có thể chạy nhiều OS thread, để xem số lượng thread (NLWP) hay thread ID (LWP), thêm option -L Xem thread với ps $ ps -efL | grep python3 # Dòng này được thêm vào cho dễ hiểu UID PID PPID LWP C NLWP STIME TTY TIME CMD -------------------------------------------------------------------------------- hvn 3818 1585 3818 0 2 21:28 pts/0 00:00:00 python3 main.py hvn 3818 1585 3819 0 2 21:28 pts/0 00:00:00 python3 main.py PID là 3818, 2 thread ID lần lượt là 3818 và 3819. Code Python3 import time from threading import Thread class MyThread(Thread): def run(self): while True: time.sleep(2) print("running") t = MyThread() t.start() t.join() Xem thread vớ...

Popular posts from this blog

Tài liệu và hướng dẫn học Python

Để tiết kiệm thời gian, tốt nhất là đi học PyMI Updated: 130617 Sau đây là các tài liệu khuyên dùng: Vì nhiều lý do, nên học python2.7 tại thời điểm hiện tại (giờ là tháng 6/2013 - muốn biết tại sao thì tự tìm hiểu) python 3.5+ (giờ là tháng 2/2017) Chuẩn bị: 1. biết bật tắt máy 2. biết cài python 3. tập gõ 10 ngón - gõ 2 ngón hay 1 ngón cũng không sao, nhưng 10 ngón là cách dễ nhất để gõ nhanh nhất. Tài liệu - Nên dùng tài liệu tại trang chủ của Python làm chính, tham khảo thêm các tài liệu khác tại http://www.familug.org/2016/12/free-ebook.html Căn bản, mới học 1.1 Python PyMI.vn https://pymi.vn/tutorial/ 1.2. Python offical tutorial kết hợp làm bài tập trên HackerRank  (đề bài bằng tiếng Anh, nhưng Google translate 1 lúc cũng ra vì có nhiều ví dụ mẫu đi kèm). Học viên của Pymi.vn có rất nhiều học viên đã tự học với Learn Python the hard way nhưng chưa thấy ai thành công cả. Hai link dưới nên đọc sau khi đã nắm được những phần cơ bản của ngôn ngữ pytho...

The PyMiers

New FAMILUG