Như chúng ta có thể thấy điều này không phải là một quá trình hiệu quả. Đang cố gắng để đoán bù đắp ngay cả khi biết nơi
bắt đầu của cuộc sống chồng là gần như không thể. Chúng tôi sẽ cần ít nhất một trăm lần thử, và tệ nhất là một vài
ngàn. Vấn đề là chúng ta cần phải đoán * chính xác * nơi địa chỉ của mã của chúng tôi sẽ bắt đầu. Nếu chúng ta đang tắt
bởi một byte nhiều hơn hoặc ít hơn chúng tôi sẽ chỉ nhận được một sự vi phạm chia nhỏ gói hoặc một lệnh không hợp lệ. Một cách để tăng
cơ hội của chúng tôi là để pad mặt trước của tràn bộ đệm của chúng tôi với các hướng dẫn NOP. Hầu như tất cả các bộ vi xử lý có một NOP
hướng dẫn mà thực hiện một hoạt động null. Nó thường được dùng để trì hoãn thực hiện cho mục đích của thời gian. Chúng tôi sẽ
tận dụng lợi thế của nó và điền một nửa tràn bộ đệm của chúng tôi với họ. Chúng tôi sẽ đặt shellcode của chúng tôi tại trung tâm,
và sau đó làm theo nó với các địa chỉ trở lại. Nếu chúng ta may mắn và các điểm địa chỉ trả lại bất cứ nơi nào trong chuỗi
các NOPs, họ sẽ chỉ có được thực thi cho đến khi họ đạt được mã của chúng tôi. Trong kiến trúc Intel lệnh NOP là
một byte dài và nó chuyển đến 0x90 trong mã máy. Giả sử các ngăn xếp bắt đầu tại địa chỉ 0xFF, rằng S là đại diện
cho mã shell, và rằng N là viết tắt của một lệnh NOP stack mới sẽ trông như thế này:
đang được dịch, vui lòng đợi..
