Reverse Arduino Uno

Chào mọi người, hôm nay mình viết 1 bài về cách để reverse firmware của một thiết bị arduino sau khi tham gia vòng 3 của matesctf. Đây là kết quả mình đúc kết được nên nếu sai ae góp ý nhé: fb.com/nhatpm. Okie bắt đầu nào, mình dùng luôn binary trong challenge 1 RE matesctf round 3 để demo.

Information

Với một bài RE về firmware của Arduino chúng ta sẽ được cung cấp một Intel Hex file (.hex) hoặc một file raw binary (thường .bin). Với Intel Hex file nếu các bạn có board thì dùng Xloader để nạp vào board chạy thử

Để bắt đầu RE, nếu được cung cấp Intel Hex file chúng ta cần chuyển qua thành raw binary. Để làm điều này thì bạn có thể dùng tool như hex2bin, avr-objcopy của bộ avr toolchain hoặc nhanh hơn lên matrixstorm để đổi.

Static Analysis

Arduino Uno là thiết bị chạy trên nền tảng Atmel AVR với microcontroller là Atmega328P. Cái này các bạn chịu khó hỏi anh Gồ là biết ngay. Với raw Binary thì IDA không thể xác định được type của binary nên chúng ta phải thực hiện manual

Hiện tại IDA chưa hỗ trợ cho microcontroller ATmega328P nên chúng ta dùng ATmega32_L để load.

Với bianry disassembly ra được thì các symbol để bị strip hết rồi. Để tăng tốc độ RE chúng ta cần detect các hàm chuẩn được dùng trong nó bằng cách dùng Arduino IDE viết 1 chương trình với đầy đủ các hàm chuẩn mà bạn đoán sẽ có trong binary, lầy hơn thì cào hết. Sau đó lấy file ELF Arduino IDE compile trong folder temp của hệ điều hành. Với file ELF chúng ta sẽ có đầy đủ thông tin symbol về các hàm trong LIB.

Sau khi có được ELF chúng ta load lên bằng IDA rồi dùng plugin như bindiff hoặc dùng idb2pat của FireEye rồi dùng sigmake trong SDK của IDA tạo ra file signature để dùng FLIRT của IDA để apply vào binary của mình. Ở đây mình sẽ dùng diaphora, đơn giản là do lười và đơn giản

Export database
Compare
Result

Với cách này ta có thể biết được tên một số hàm trong binary đã bị strip symbols.
Okie thế là kết thúc quá trình chuẩn bị cho việc RE firmware của Arduino Uno. Việc còn lại là ngồi RE đống code đó, cái này tùy vào từng bài nên mình không nêu tiếp ở đây.

Dynamic Analysis

Với một kiến trúc mới và đặc biệt là theo kiểu RISC của AVR thì nếu chỉ static analysis thôi thì quá khó cho chúng ta. Trên Linux các bạn có thể dùng simavr cùng với picocomavr-gdb để debug. Ở đây mình giới thiệu cách debug trên Windows vì nó có giao diện và dễ sử dụng đặc biệt là cho người mới.

Tools được sử dụng là AVR Studio 4Hapsim. Chúng ta sẽ dùng AVR Studio để load và deug chương trình và dùng Hapsim để xem dữ liệu được in truyển qua Serial.

Mở AVR Studio 4 lên và Open File như phần mềm thông thường. AVR Studio cho phép chúng ta mở Intel Hex file nên dùng file này để debug. Sau khi mở nó sẽ yêu cầu chúng ta chọn Platform debug và Device. Chúng ta sẽ chọn AVR Simulator để tương thích với Hapsim và Device là ATmega380P cho Arduino Uno

Bên Hapsim chúng ta chuyển qua ATmega328P và add new control là Terminal để biết dữ liệu được truyển ra của chương trình qua cổng Serial.

Với AVR Studio thì ta có được 1 chương trình debug với GUI mạnh mẽ, dễ dàng đọc được context của chương trình khi chạy như thanh ghi ở phía tay trái, disassembly với comment cho các lệnh rất tiện cho người mới tiếp xúc, hệ thống hardware ở phía tay phải cho phép điều chỉnh cờ để kích hoạt

Một tính năng mình thấy cần thiết nữa là Up/Download trong menu Debug. Cho phép chúng ta dump hoặc chỉnh sửa thông tin memory ở nhiều kiểu khác nhau. Với tính năng này thì ta có thể tùy chỉnh memory theo ý mình.

Một phần hết sức quan trọng khác đó là cách truyền dữ liệu qua cổng serial như của Serial Monitor trong Arduino IDE. Chúng ta sẽ truyển vào chương trình qua USART0 nó là giao thức truyền và nhận dữ liệu trên kiến trúc AVR, Serial là một chuẩn riêng từ giao thức này. Chúng ta sẽ để byte cần truyền vào USART I/O Data Register và check vào flag USART Receive Complete để thông báo là cho dữ liệu truyền vào

Bằng cách nhứ thế chúng ta sẽ có được gần như đầy đủ các tính năng support cho việc dynamic analysis.

Bài viết xin được kết thúc ở đây. Cảm ơn mọi người đã dành thời gian đọc. :D.

One thought on “Reverse Arduino Uno

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s