👶 BEGINNER LEVEL
Khi mình chọn ngành chọn trường thi đại học, chỉ nghĩ đơn giản là chọn ngành nào ra sau này dễ xin việc, kiếm được tiền 💰. Hồi đó chọn ngành an toàn thông tin chỉ vì nghe nó mới và lạ, có lẽ sẽ ít phải cạnh tranh so với ngành công nghệ thông tin. Vào đại học không giống như các thần đồng trong ngành mà mình biết, 2 năm đầu mình chỉ học theo chương trình trên lớp, lập trình/acm rồi các môn cơ sở ngành gần như không hề có khái niệm về Security là gì và cũng không biết làm Security thì phải học như nào (có lẽ cũng do bản thân mình lười không tự tìm hiểu). Bước ngoặt của mình là rơi vào năm học thứ 3, mình nghe được nhiều tin tuyển dụng về Security hơn, tham gia thi tuyển, xin thực tập và mình may mắn được vào Viettel. Ở đây mình mới bắt đầu có những tư duy về Security cũng như là nơi đào tạo mình để mình được như bây giờ.
Mình bắt đầu tiếp xúc với reverse engineering qua các challenge nhỏ mà mình được đào tạo ở Viettel, sau đó thì bắt đầu chơi CTF. Tham gia cũng nhiều cuộc thi CTF trong và ngoài nước nhưng cũng không có thành tích gì mấy. Ở đây mình sẽ chia sẻ cho các bạn biết về những thứ mình đã học, luyện khi tiếp xúc với reverse engineering, tất nhiên mình sẽ không nói về các khái niệm, thống kê cũng như phân loại nó vì đơn giản mình không biết đủ rộng để làm việc đó (nếu thắc mắc về khái niệm các bạn có thể tự Google). Chỉ là quan điểm cá nhân do mình rút ra có thể đúng hoặc sai nhưng mình vẫn hi vọng sẽ giúp cho những bạn mới muốn tìm hiểu và đi theo security nói chung và Reverse Engineering nói riêng.
💡 HỌC GÌ?
Nhiều bạn muốn đi theo hướng Reverse nhưng sẽ không biết phải bắt đầu từ đâu? Tiếp cận như nào?
Mình sẽ nêu các phần cơ bản đó dưới đây:
👨🏼💻 HỌC LẬP TRÌNH
Chắc nhiều người nghĩ học lập trình thì đi làm coder làm thế mẹ nào được hacker. Nếu nghĩ thế thì bạn đã nhầm hoàn toàn, ở đây khả năng Reverse của bạn sẽ tỉ lệ thuận với khả năng lập trình. Đặt vào 1 trường hợp cụ thể khi bạn Reverse 1 đoạn mã trong 1 ngữ cảnh nào đó, nếu bạn đã từng lập trình và hiểu nó rồi thì khi Reverse sẽ biết ngay là tác giả đang làm gì và muốn làm gì, còn nếu bạn chứ từng lập trình thì sẽ mất khá nhiều thời gian để bạn hiểu được đoạn mã đó.
Học lập trình thì nên học như thế nào? Đối với mình thì mình khuyên các bạn nên học tư duy lập trình, không nên học tràn lan nhiều ngôn ngữ. Tư duy lập trình là kiểu bạn nhìn nhận giải quyết vấn đề đó từ nhỏ đến lớn sau đó sẽ đưa ra các giải pháp. Khi bạn hình thành được tư duy lập trình thì bạn chỉ cần học 1 ngôn ngữ các ngôn ngữ khác sẽ chỉ khác cú pháp còn lại mọi thứ đều năm ở tư duy lập trình. Chỉ mất 1 đến 2 tháng là bạn có thể thành thạo lập trình trên ngôn ngữ mới.
Reverser thì học lập trình ngôn ngữ nào? Tất nhiên sẽ là hợp ngữ (Assembly), C/C++,… Bạn hãy thử lập trình mọi thứ với Assembly từ các chương trình đơn giản như nhập vào in ra, xử lý chuỗi,… đến những chương trình phức tạp hơn như là paint, notepad,… Nghe có vẻ vô bổ nhưng đó sẽ là cái móng vững chắc để bạn xây nên tòa lâu đài.
Và một ngôn ngữ thì sẽ không bao giờ đủ đối với reverse, bạn cần học và biết nhiều về ngôn ngữ hơn nữa như java, python, js, golang, rust …
👨🏼🏫 HỌC HỆ ĐIỀU HÀNH
Đọc và hiểu về hệ điều hành sẽ giúp bạn hiểu mọi thứ đang xảy ra trong 1 chương trình mà bạn muốn Reverse. Hãy học về những thứ căn bản như kiến trúc, các thanh ghi, bộ nhớ, user/kernel,…
Linux sẽ là 1 hệ điều hành lý tưởng cho bạn tiếp cận, sau đó là windows, Apple OS, android,… Và bạn cũng nên target tìm hiểu thật sâu 1 hệ điều hành.
🔧 HỌC CÁCH SỬ DỤNG CÁC CÔNG CỤ HỖ TRỢ
Tìm hiểu các công cụ hỗ trợ việc Reverse, debug chương trình như gdb, lldb, olydbg, windbg, x64dbg,… Không có cách học sử dụng nào nhanh bằng việc thực hành trên chính nó, sử dụng nhiều thì bạn mới có thể thành thạo được.
Các công cụ trên mình không liệt kê IDA, theo quan điểm của mình với những người bắt đầu bạn nên học cách đọc mã máy (assembly), đọc hiểu mã máy sẽ giúp bạn có cái nhìn đầy đủ và sâu hơn so với việc bạn lôi ida ra và F5 để xem mã giả C. Như phần lập trình mình có nói nên lập trình Assembly, nó sẽ giúp bạn hiểu cách thức hoạt động cơ bản của 1 hàm như thế nào (register, buffer, stack, heap, stack frame, call stack, calling convention,…)
🚩 CHƠI CTF
CTF là con đường ngắn và rõ ràng nhất giúp bạn tiếp xúc với security. Với Reverse hãy thử luyện trên các trang web phổ biến như rootme, reversing.kr, ringzer0… giải quyết lần lượt các challenge từ dễ đến khó, qua quá trình rèn luyện bạn sẽ tự thấy kĩ năng của mình đi lên ầm ầm cho mà coi.
📚 HỌC KIẾN THỨC NỀN TẢNG
Bạn không nên quá target vào 1 mảng là reverse, nên học rộng học nhiều thì mới có thể có cái nhìn bao quát về Security hơn. Hãy tìm hiều về Crypto, Network, Web, Exploit, Forensic,… và mọi thứ mà trên trường dạy bạn, mình nghĩ nó không vô dụng đâu.
👦 ADVANCED LEVEL
Nếu các bạn nghe mình và học theo các các thức mình liệt kê ở trên thì mình nghĩ các bạn cũng đã có những cái nhìn cụ thể về Security và Reverse. Tuy nhiên dừng lại ở đó thì bạn chỉ có thể cào bàn phím chém gió và đi lòe mọi người…
Bạn cần phải luyện luyện luyện nhiều hơn nữa, làm đi làm lại nhiều lần, thành thạo các tool, các kỹ thuật, …
🚩 CTF
Vâng lại là CTF, bạn nên tham gia các cuộc thi CTF trong và ngoài nước, từ online đến onsite. Ở đây bạn sẽ gặp rất nhiều dạng mà có thể được coi là xu thế trên thế giới, có dạng dễ dạng khó, có dạng làm được dạng không làm được.
Tuy nhiên nếu không làm được bạn đừng nản lòng, kết thúc mỗi cuộc thi hãy tìm đọc writeup và tự làm lại hoặc có thể hỏi trực tiếp người ra đề, họ sẵn sàng chia sẻ và chỉ cho bạn các giải quyết bài đó.
Khi chơi CTF bạn sẽ gặp vô vàn các dạng Reverse, không chỉ là Reverse 1 chương trình C/C++ đơn giản mà có thể Reverse phần cứng, Reverse game,… trên các hệ điều hành khác như Android, IOS,… và có đủ các loại ngôn ngữ lập trình, kiến trúc được sử dụng để bạn Reverse. Hãy thử tham khảo flare-on để cảm nhận.
Cứ mỗi bài CTF là 1 bài học, sẽ có nhiều thứ mới mẻ bạn học được từ nó.
💻 HỌC VỀ COMPILER
Như ở phần cơ bản các bạn học lập trình thì ở đây bạn nên tìm hiểu cách build và chạy 1 chương trình như thế nào.
Cách compiler thực hiện gồm những bước gì? Vì sao từ 1 file bạn lập trình mà máy có thể hiểu và thực thi được?
🔧 MASTER CÁC TOOL VÀ CÁC KĨ THUẬT TRONG REVERSE
Đến giai đoạn này mình lại khuyến khích các bạn sử dụng IDA để Reverse và sửa code trên mã giả C. Từ cách đổi tên biến/hàm, sửa kiểu dữ liệu, tạo struct,… bạn sửa mã giả C càng đẹp thì bạn đọc hiểu sẽ nhanh và người khác đọc cũng dễ chịu.
Tìm hiểu các kỹ thuật anti (anti-debug, anti-monitor, anti-vm,…) mà người ta hay sử dụng để bảo vệ chương trình, cũng như các cách obfuscate code gây khó khăn cho người reverse.
Tìm hiểu pack/unpack, đây là 1 kĩ thuật phổ biến mà tác giả của phần mềm sử dụng để bảo vệ chương trình của mình khỏi các reverser.
💾 TẬP TÀNH REVERSE MALWARE (MALWARE ANALYSIS)
Công việc phổ biến hàng đầu đối với 1 người làm Reverse chính là Malware Analysis. Khi phân tích 1 mẫu malware trước hết bạn nên tìm hiểu cách setup 1 mỗi trường an toàn khi phân tích nó.
Tìm 1 số mẫu đơn giản thử phân tích tìm hiểu xem nó làm gì, lây nhiễm ra sao. Khi có kết quả đó rồi hãy suy nghĩ làm thế nào để có thể clean được hệ thống khi nó đã lây nhiễm ra, đó là 1 công việc thú vị và đòi hỏi có nhiều kinh nghiệm.
Malware sẽ sử dụng rất nhiều kĩ thuật gây khó khăn cho người phân tích, và nếu bạn phân tích đủ nhiều bạn sẽ nhận biết được nó và cách giải quyết nó rất nhanh. Làm 10 mẫu bạn chưa nhận ra được, 100 mẫu bận chưa nhận ra được thì 1000 mẫu, nói chung với reverse malware phải làm thật nhiều, gặp thật nhiều thì bạn mới hình thành được 1 khuôn mẫu để giải quyết nó rất nhanh.
👱♂️ GOSU LEVEL
Khi đã tới level này, mỗi người sẽ đều có 1 hướng cho mình rồi, tất nhiên mục đích cuối cùng là để kiếm ra tiền. Các bạn có thể theo nghiệp phân tích Malware, tạo ra Malware (không khuyến khích), tham gia bug bounty,… Mỗi người có 1 sở thích và chọn con đường của riêng mình, nên đến đây mình cũng không biết nên chia sẽ như thế nào cho đủ vì mỗi con đường các bạn sẽ phải tìm hiểu 1 cái khác nhau sẽ không phải chung chung như hồi còn newbie nữa.
Nhưng dù có làm gì trong 3 cái mà mình nêu trên mình nghĩ reverse vẫn là cái cốt lõi, các bạn vẫn phải học, trau dồi thật nhiều các xu thế hiện nay để không đi thụt lùi so với thế giới.
👨🎓 HỌC MỌI THỨ
Tự học thêm các ngôn ngữ mới và cách Reverse khi gặp các chương trình sử dụng những ngôn ngữ này. Cách mình hay dùng là sử dụng ngôn ngữ lập trình ra 1 chương trình thực thi và reverse chương trình đó.
Tìm hiều về các kỹ thuật được dụng hiện này trong các mẫu Malware, trong các chương trình, các đề CTF. Mình thấy 1 kênh mà khá nhiều các idol đi trước hoạt động và rất hay chia sẽ các kiến thức và kĩ thuật đó Twitter, mình nghĩ đó là 1 kho tàng tri thức mà các bạn có thể học được
👨💻 RESEARCH
Hãy thử research những cái mới mà chưa có cách giải quyết nào tối ưu. Tự tạo các plugin giúp ích cho việc reverse nhanh hơn,… Khi có gì mới có gì hay bạn hãy thử submit các bài diễn thuyết ở các hội thảo, chia sẽ nó với cộng đồng để có nhiều góc nhìn hơn từ mọi người.
Nếu theo hướng bug hunter hãy thử tìm hiểu, viết 1-day. Tìm hiểu fuzz và cách mà họ sử dụng fuzz để tìm ra được bug.
Tìm hiểu các giải pháp an toàn thông tin, tự nhận định đánh giá các giải pháp đó. Đặt ra các bài toán về Security có gắng tìm cách giải quyết. Phần này rất hay và không phải ai cũng làm được, nhưng cứ tự tin và thử, chưa thử thì không thể biết được kết quả.
🙆♂️ ĐẠO ĐỨC NGHỀ NGHIỆP
Cái này mình nghĩ roadmap mảng nào cũng sẽ đề cập, và nội dung sẽ như nhau. Mỗi 1 hướng đi của các bạn sẽ đều tạo ra các rủi ro như nhau nếu bạn đi vào con đường của tội phạm mạng. Hãy tỉnh táo, sáng suốt và đừng trẻ trâu :D.
💡 WHAT’S NEXT ?
Cơ hội nghề nghiệp của Reverse engineering hoàn toàn có thể trở thành Malware Analysis / Researcher / Bug bounty hunter / Red Team tùy vào sở thích mỗi người. Hi vọng qua bài viết này sẽ giúp ích cho những bạn đang có ý định hoặc đang theo con đường reverse.
Ở bài viết này mình chia sẽ có thể còn sơ sài và khó hiểu nếu có gì thắc mắc hãy chat trực tiếp với mình qua Twitter: https://twitter.com/linhlhq (tiện tay thì follow mình nhé).
Cảm ơn vì đã đọc, hẹn gặp lại các bạn trong series tiếp theo.
Thanks,
linhlhq
What do you think?