
Алгоритм простейший:
скрипт, отдающий страничку с формой, генерит пару чисел. Первое - само число, которое надо ввести в форму, второе - идентификатор.
Оба числа кладутся куда-нито (в базу, например).
Также скрипт на страничке выводит ссылку на картинку, в имени которой учавствует сгенерированный идентификатор.
Когда броузер запрашивает эту картинку, её выводит скриптик, который по идентификатору вытаскивает число, рисует его на картинке (упомянутым GD) и отдает картинку броузеру.
При сабмите формы, проверяется соответствие идентификатора и введенного числа и форма принимается или отвергается.
Старые накопившиеся пары чисел - периодически удалять.
PS. описывать намного сложнее, чем реализовать
"No! Try not! Do. Or do not. There is no try." -- Yoda