Int b=1; main(){int x = 2; printf("%d %d", x, b);}. In this program, what ASM opcode causes eip to move to the printf entry point?

5 phương ánCó giải thích

Các phương án trả lời

Chọn một phương án
Lời giảiChọn phương án để mở
Đáp án đúng: "call". Khi biên dịch, lời gọi printf với chuỗi định dạng và hai biến x, b trở thành một chuỗi lệnh: các tham số được push lên ngăn xếp theo thứ tự từ phải sang trái (b, rồi x, rồi địa chỉ chuỗi định dạng), sau đó lệnh call printf đẩy địa chỉ lệnh kế tiếp lên ngăn xếp làm địa chỉ trả về và nạp địa chỉ đầu hàm printf vào EIP; chính call làm EIP nhảy tới điểm vào của printf, và khi printf xong thì lệnh ret lấy lại địa chỉ trả về. Bác: "push" chỉ đưa tham số lên ngăn xếp và giảm ESP, EIP vẫn chạy tuần tự sang lệnh kế. "pop" lấy giá trị ra khỏi ngăn xếp, cũng không đổi luồng thực thi. "jz" là nhảy có điều kiện khi cờ ZF bằng 1, dùng cho rẽ nhánh if hay vòng lặp, không dùng để gọi hàm vì không lưu địa chỉ trả về. "amp" không phải lệnh hợp ngữ x86 nào, nên không thể chuyển EIP tới printf.

Cùng phần 4

Xuất hiện trong 1 bộ đề