Skip to content

Latest commit

 

History

History
151 lines (105 loc) · 7.27 KB

Pwnable_Introduce.md

File metadata and controls

151 lines (105 loc) · 7.27 KB

#Author: h4niz

#Email: haniz.cons@gmail.com

#Blog: h4niz.wordpress.com

Pwnable

Pwnable hay viết tắt là pwn, là một hình thức thi dạng trả lời theo từng chủ đề (Jeopardy) trong cuộc thi CTF (Capture the flag). Pwn tập trung vào các kỹ thuật tấn công vào hệ thống, phát hiện và khai thác các lỗ hổng trên các nền tảng hệ điều hành Linux & Windows.

Nhập môn Pwnable và những thứ cần biết?

Các định nghĩa:

Pwnable: viết tắt là pwn chỉ đơn giản là tên gọi!

Exploit: một hành động nhằm thực hiện khai thác một lỗi, lỗ hổng bảo mật nào đó

Payload: Là mã khai thác của một lỗ hổng nào đó, do bạn xây dựng hoặc người khác xay dựng. Nói một cách dễ hiểu. Nếu bạn mốt phá một ổ khóa, thì hành động phá khóa gọi là exploit, còn bộ công cụ và quá trình khai thác là payload.

CVE, Zeroday, Oneday: cái này Google đi nha

Các thuật ngữ:

Stack: Google đi cho dễ hiểu

Heap: Google đi cho dễ hiểu

Virtual Address: Google đi cho dễ hiểu

CPU: Google đi cho dễ hiểu

Register: Google đi cho dễ hiểu

Hex: Google đi cho dễ hiểu

Các kiến thức cơ bản

Hệ số đếm

Hệ nhị phân (binary) là hệ cơ số hai, được máy tính sử dụng. Mỗi một chữ số có thể có giá trị là 0, hoặc 1. Mỗi chữ số này được gọi là một bit. Tám (8) bit lập thành một byte (có ký hiệu là B). Một kilobyte (KB) là 1024 2^10 bytes. Một megabyte (MB) là 1024 KB.

Hệ thập phân (decimal) là hệ cơ số mười mà chúng ta, con người, sử dụng hàng ngày. Mỗi một chữ số có thể có giá trị là 0, 1, 2, 3, 4, 5, 6, 7, 8, hoặc 9.

Hệ thập lục phân (hexadecimal) là hệ cơ số mười sáu, được sử dụng để tính toán thay cho hệ nhị phân vì nó ngắn gọn và dễ chuyển đổi hơn. Mỗi một chữ số có thể có giá trị 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, và F trong đó A có giá trị là 10 (thập phân), B có giá trị là 11 và tương tự với C, D, E, F. Chúng ta đã quá quen với hệ thập phân, nghĩa là các số với giá trị là {0,1,2,3,4,5,6,7,8,9}, hệ nhị phân cũng tương tự nhưng chỉ có 2 giá trị là {0,1} và hệ thập lục phân sẽ sử dụng các số có giá trị là {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}, ở đây mình xin đi qua một số ví dụ để các bạn có thể nắm được một số cách chuyển đổi cơ bản.

Hệ thập phân: 1984 = 1•103 + 9•102 + 8•101 + 4•100 273.15 = 2•102 + 7•101 + 3•100 + 1•10-1 + 5•10-2

Hệ nhị phân: 011010102 = 0•27 + 1•26 + 1•25 + 0•24 + 1•23 + 0•22 + 1•21 + 0•20 = 64+32+8+2 = 106

Hệ thập lục phân: 0x12AD = 1•163 + 2•162 + 10•161 + 13•160 = 4096+512+160+13 = 4781

More: Google

Kiến trúc máy tính:

Máy tính gồm ba bộ phận chính là bộ xử lý (CPU), bộ nhập chuẩn (bàn phím) và bộ xuất chuẩn (màn hình). Chúng ta sẽ chỉ quan tâm đến bộ xử lý vì đây chính là trung tâm điều khiển mọi hoạt động của máy tính.

Bộ nhớ

Thanh ghi là bộ nhớ siêu tốc nhưng đáng tiếc dung lượng của chúng quá ít nên chúng không phải là bộ nhớ chính. Bộ nhớ chính mà chúng ta nói đến là RAM với dung lượng thường thấy đến 1 hoặc 2 GB.

RAM là viết tắt của Random Access Memory (bộ nhớ truy cập ngẫu nhiên). Đặt tên như vậy vì để truy xuất vào bộ nhớ thì ta cần truyền địa chỉ ô nhớ trước khi truy cập nó, và tốc độ truy xuất vào địa chỉ nào cũng là như nhau. Vì thế việc xác định địa chỉ ô nhớ là quan trọng.

Tập lệnh, mã máy:

Tập lệnh là tất cả những lệnh mà CPU có thể thực hiện. Đây có thể được coi như kho từ vựng của một máy tính. Các chương trình là những tác phẩm văn học; chúng chọn lọc, kết nối các từ vựng riêng rẽ lại với nhau thành một thể thống nhất diễn đạt một ý nghĩa riêng.

Cũng như các từ vựng trong ngôn ngữ tự nhiên, các lệnh riêng lẻ có độ dài khác nhau (như đã nêu ra trong ví dụ ở Hình 2.1). Chúng có thể chiếm 1 hoặc 2 byte, và đôi khi có thể tới 9 byte. Những giá trị chúng ta đã thấy như 90, 31 C0 là những lệnh được CPU hiểu và thực hiện được. Các giá trị này được gọi là mã máy (machine code, opcode). Mã máy còn được biết đến như là ngôn ngữ lập trình thế hệ thứ nhất.

Hợp ngữ

Hợp ngữ có nhiều nhóm lệnh khác nhau. Chúng ta sẽ chỉ điểm qua các nhóm và những lệnh sau.

Nhóm lệnh gán là những lệnh dùng để gán giá trị vào ô nhớ, hoặc thanh ghi ví dụ như LEA, MOV, SETZ.

Nhóm lệnh số học là những lệnh dùng để tính toán biểu thức số học ví dụ như INC, DEC, ADD, SUB, MUL, DIV.

Nhóm lệnh luận lý là những lệnh dùng để tính toán biểu thức luận lý ví dụ như AND, OR, XOR, NEG.

Nhóm lệnh so sánh là những lệnh dùng để so sánh giá trị của hai đối số và thay đổi thanh ghi EFLAGS ví dụ như TEST, CMP.

Nhóm lệnh nhảy là những lệnh dùng để thay đổi luồng thực thi của CPU bao gồm lệnh nhảy không điều kiện JMP, và các lệnh nhảy có điều kiện như JNZ, JZ, JA, JB.

Nhóm lệnh ngăn xếp là những lệnh dùng để đẩy giá trị vào ngăn xếp, và lấy giá trị từ ngăn xếp ra ví dụ như PUSH, POP, PUSHA, POPA.

Nhóm lệnh hàm là những lệnh dùng trong việc gọi hàm và trả kết quả từ một hàm ví dụ như CALL và RET

Các lỗi cơ bản:

Tràn bộ đệm(Buffer Overflow)

Tràn số nguyên (Integer Overflow)

Format String

Race Condition

Heap Overflow

Thực tiễn:

Có các chương trình bounty dành cho các hacker tìm được lỗi của các phần mềm nằm trong scope như: ZDI, Pwn2Own,..

Các sản phẩm không nằm trong scope có bounty thì sẽ được assign CVE nếu có đủ impact

Chơi CTF for fun

Lời kết:

Nếu bạn nghĩ đây là tất cả về Pwnable, pwn, Software Exploitation thì bạn không hề sai! Mà bạn quá sai. Tất cả những điều trên chưa là gì, mình viết bài này với một mục đích là cung cấp cho các bạn một cái nhìn cực kì vắn tắt, cực kì tổng quan về mảng kiến thức này. Mỗi mục trong bài viết này đểu có thể viết thành một đề tài riêng với ít nhất 5 dòng chữ để diễn giải! Mình không dám chắc là 5 dòng đó có đủ giải thích cho bạn hiểu hay không? Nhưng! Nếu bạn đã tốn công sức đọc đến đây sao không thử tìm hiểu thêm về mảng kiến thức này?

Đường đi ngàn dặm, bắt đầu từ bước đầu tiên - Lão Tử

Hãy bước đi những bước đi đầu tiên cùng sự lựa chọn của bạn!