Tác giả: Sun
Cộng đồng Discord
Bài viết này được đăng trên XREX và WTF Academy
Khi tôi bắt đầu học phân tích giao dịch on-chain, không có nhiều tài liệu học tập online,. Mặc dù chậm, nhưng tôi đã có thể tập hợp đủ thông tin để thực hiện các thử nghiệm và phân tích.
Từ những nghiên cứu của tôi, chúng tôi sẽ tung ra một loạt bài viết về bảo mật Web3 để thu hút nhiều người tham gia và cùng nhau tạo ra một mạng lưới an toàn.
Trong series đầu tiên, chúng tôi sẽ giới thiệu cách thực hiện phân tích on-chain, sau đó chúng tôi sẽ tái tạo các cuộc tấn công on-chain. Kỹ năng này sẽ giúp chúng ta hiểu quá trình tấn công, nguyên nhân gốc rễ của các lỗ hổng, và thậm chí cách các robot thực thi chênh lệch giá.
Trước khi bước vào phân tích, cho phép tôi giới thiệu một số công cụ thông dụng. Các công cụ đúng có thể giúp bạn thực hiện việc nghiên cứu hiệu quả hơn
Phalcon | Tx.viewer | Cruise | Ethtx | Tenderly
Các công cụ xem giao dịch (Transaction Viewers) được sử dụng phổ biến nhất, chúng có thể liệt kê ra hàm gọi và dữ liệu đầu vào mỗi hàm trong các giao dịch. Các công cụ xem giao dịch khá tương đồng, khác biệt giữa chúng nằm ở các chain mà chúng hỗ trợ và mỗi công cụ có những chức năng phụ khác nhau. Cá nhân tôi sử dụng Phalcon và Sam's Transaction Viewer. Với những chain mà chúng không hỗ trợ, tôi sẽ dùng Tenderly. Tenderly hỗ trợ hầu hết chain, nhưng không dễ hiểu bằng các công cụ kia, và việc phân tích có thể chậm khi dùng tính năng Debug. Tuy nhiên, đó là một trong những công cụ đầu tiên mà tôi dùng để học cùng với Ethtx.
Phalcon: Ethereum、BSC、Avalanche C-Chain、Polygon、Solana、Arbitrum、Fantom、Optimism、Base、Linea、zkSync Era、Kava、Evmos、Merlin、Manta、Mantle、Holesky testnet、Sepolia testnet
Sam's Transaction viewer: Ethereum、Polygon、BSC、Avalanche C-Chain、Fantom、Arbitrum、Optimism
Cruise: Ethereum、BSC 、Polygon、Arbitrum、Fantom、Optimism、Avalanche、Celo、Gnosis
Ethtx: Ethereum、Goerli testnet
Tenderly: Ethereum、Polygon、BSC、Sepolia、Goerli、Gnosis、POA、RSK、Avalanche C-Chain、Arbitrum、Optimism 、Fantom、Moonbeam、Moonriver
Chúng ta sẽ "mổ xẻ" giao dịch trong cuộc tấn công (JayPeggers - kiểm tra không dầy đủ + tấn công lặp lại). TXID
Đầu tiên, tôi sử dụng công cụ Phalcon được phát triển bởi Blocksec để minh họa. Chúng ta có thể thấy thông tin cơ bản và thay đổi số dư của giao dịch trong hình dưới đây. Từ sự thay đổi số dư, chúng ta có thể nhanh chóng thấy kẻ tấn công đã có được bao nhiêu lợi nhuận. Trong ví dụ này, lợi nhuận của kẻ tấn công là 15.32 ETH.
Hiển thị dòng gọi thực thi (Invocation Flow Visualization) - là một chức năng gọi với thông tin cấp theo dõi (trace-level information) và các log sự kiện (event log). Nó cho chúng ta biết các lần gọi thực thi, mức độ gọi hàm của giao dịch, có sử dụng khoản vay nhanh (flashloan) hay không, các dự án liên quan, hàm nào được gọi và các tham số và dữ liệu thô được đưa vào, vv.
Phalcon 2.0 đã thêm quá trình di chuyển của dòng tiền (funds flow), công cụ Debug + các phân tích source code trực tiếp có thể xem được source code, tham số và các giá trị trả về cùng với các "vết" (trace). Chúng rất tiện lợi cho việc phân tích.
Bây giờ chúng ta sẽ dùng công cụ Sam's Transaction Viewer cho TXID vừa rồi. Sam đã tích hợp nhiều công cụ trong đó, như thể hiện trong hình bên dưới, bạn có thể thấy được sự thay đổi trong Storage và Gas tiêu thụ bởi mỗi thực thi gọi (call).
Bấm Call ở bên trái để giải mã Dữ Liệu Đầu Vào sơ cấp (raw Input Data).
Bây giờ chúng ta sẽ dùng Tenderly để phân tích giao dịch của chúng ta TXID, bạn có thể thấy được thông tin cơ bản như các công cụ khác. Nhưng khi sử dụng tính năng Debug, nó không hiển thị như các công cụ đó và cần phải phân tích từng bước một. Tuy nhiên, bạn có thể xem mã và quá trình chuyển đổi dữ liệu đầu vào khi Debugging.
Điều này có thể giúp chúng ta xác định tất cả những thứ giao dịch này đã thực hiện. Trước khi viết POC, chúng ta có thể tái hiện tấn công replay không? Có! Cả Tenderly hoặc Phalcon đều hỗ trợ mô phỏng giao dịch, bạn có thể thấy nút Re-Simulate ở góc trên bên phải trong hình trên. Công cụ sẽ tự động điền các giá trị tham số từ giao dịch cho bạn như trong hình dưới đây. Các tham số có thể được thay đổi theo nhu cầu mô phỏng, chẳng hạn như thay đổi số thứ tự block, From, Gas, dữ liệu đầu vào, v.v.
Trong Dữ Liệu Đầu Vào sơ cấp (raw Input Data), 4 bytes đầu là chữ ký của function (Function Signatures). Đôi khi nếu Etherscan hay công cụ phân tích khác có thể xác địch được hàm, chúng có thể kiểm tra các hàm thông qua cơ sở dữ liệu chữ ký.
Ví dụ sau đây giả sử rằng chúng ta không biết hàm 0xac9650d8
là gì.
Thông qua một truy vấn sig.eth, chúng ta tìm được chữ ký 4 bytes là multicall(bytes[])
Chuyển ABI thành Interface | Lấy ABI cho contract chưa xác minh | Bộ giải mã ETH CallData | ETHCMD - Guess ABI
Chuyển ABI thành Interface: Khi phát triển POC, bạn cần gọi các contracts khác bằng interface. Chúng ta có thể dùng công cụ này để nhanh chúng tạo interface. Vào Etherscan để copy ABI vào công cụ này để lấy interface. Ví dụ.
Bộ giải mã ETH Calldata: Nếu bạn muốn giải mã input data mà không dùng ABI, thì đây là công cụ bạn cần. Với Sam's Transaction Viewer mà tôi giới thiệu hồi nãy cũng hỗ trợ giải mã dữ liệu đầu vào.
Lấy ABI cho contracts chưa xác minh: Nếu bạn gặp contract chưa được xác minh, bạn có thể dùng công cụ này để tìm ra chữ ký hàm. Ví dụ
Etherscan-decompile bytecode | Dedaub | heimdall-rs
Etherscan có tính năng biên dịch ngược (decompilation), nhưng độ đọc hiểu của kết quả thường không tốt. Cá nhân tôi thường sử dụng Dedaub, nó có thể tạo ra biên dịch ngược tốt hơn. Tôi khuyên bạn nên dùng Dedaub. Hãy cùng sử dụng một MEV Bot bị tấn công làm ví dụ. Bạn có thể thử thực hiện biên dịch ngược bằng contract.
Đầu tiên, copy Bytecodes của contract chưa xác minh vào Dedaub rồi click Decompile.
Nếu bạn muốn học thêm, bạn có xem các Video dưới đây.
eth txn explorer và vscode extension của samczsun
Lỗ Hổng Trong Defi - Daniel V.F.