Professional Documents
Culture Documents
Tràn số?
Segmentation fault?
Khảo sát
Reverse engineering?
Buffer overflow?
CTF?
printf.o
Pre-
hello.c hello.i CompilerBiên dịchAssembler hello.o
hello.s Linker hello
processor
(cc1) (as) (ld)
Source (cpp) Modified Relocatable Executable
Assembly
program source object object
program
(text) program programs program
(text)
(text) (binary) (binary)
Ví dụ 1: Có chắc x2 ≥ 0?
▪ Float: Đúng!
▪ Int:
▪ 40.000 * 40.000 = 1.600.000.000
▪ 50.000 * 50.000 = ??
Ví dụ 2: Có chắc (x + y) + z = x + (y + z)?
▪ Kiểu int có dấu và không dấu: Đúng!
▪ Float:
▪ (1e20 + -1e20) + 3.14 --> 3.14
▪ 1e20 + (-1e20 + 3.14) --> ??
Tính toán số học trong máy tính?
Các phép tính toán số học có những tính chất quan trọng
Không thể giả định tất cả tính chất toán học “thông thường”
→ Cần phải hiểu kiểu nào được áp dụng trong ngữ cảnh nào
→ Vấn đề quan trọng đối với lập trình compiler và lập trình các ứng dụng
quan trọng
Vấn đề #2:
Cần phải biết Assembly – Hợp ngữ
Hiểu assembly = hiểu quá trình thực thi ở mức máy tính
▪ Hành vi của các chương trình có bug
▪ Vấn đề đang xảy ra ở ngôn ngữ lập trình cấp cao
▪ Tăng hiệu suất thực thi của chương trình
▪ Hiểu được các bước tối ưu hoá mà các compiler thực hiện
▪ Hiểu được nguyên nhân làm hiệu suất chương trình thấp
▪ Triển khai các phần mềm hệ thống
▪ Tạo/chống các malware
▪ Assembly x86 là lựa chọn hay dùng!
Vấn đề #3:
Ảnh hưởng của bộ nhớ: Vấn đề khi truy cập bộ nhớ?
typedef struct {
int a[2];
double d;
} struct_t;
double fun(int i) {
volatile struct_t s;
s.d = 3.14;
s.a[i] = 1073741824; /* Possibly out of bounds */
return s.d;
}
fun(0) = 3.14
fun(1) = 3.14
fun(2) = 3.1399998664856
fun(3) = 2.00000061035156
fun(4) = 3.14
fun(6) = Segmentation fault
4.3ms 81.8ms
2.0 GHz Intel Core i7 Haswell
Máy tính kết nối với các máy tính khác qua mạng
▪ Nhiều vấn đề cấp hệ thống phát sinh khi có mạng