Во-первых, не
invoke ReadConsole, ADDR input, ADDR input_buf, 1, ADDR read, 0
а
invoke ReadConsole, input, ADDR input_buf, 1, ADDR read, 0
В данном случае надо не адрес переменной, а её содержимое. Поэтому, кстати, и не читается ничего.
Во-вторых, переменные 
read и 
written должны быть размером не 
db, а 
dd. ReadConsole возвращает DWORD, а не BYTE и само собой возвращаемое значение 
read забивает собой ранее полученное 
output, там получаются нули и поэтому ничего не выводится.
В-третьих, судя по 
invoke ReadConsole, input, ADDR input_buf, 1, ADDR read, 0
 производится чтение 
ОДНОГО символа, а выводится
invoke WriteConsoleA, output, ADDR input_buf, 3, ADDR written, 0
почему-то три.
Ну и чисто косметически:
а) почему input_buf объявлен как массив DWORD? его надо объявлять как массив BYTE 
input_buf db КОЛИЧЕСТВО_БАЙТ_ПЛАНИРУЕМОЕ_ПРОЧИТАТЬ dup(?)
б) нафига вызов Sleep? он там нафиг не нужен
в) зачем ReadConsole, но при этом WriteConsoleA? Или все *A, или уж все функции (что IMHO лучше) все функции 
без *A в конце.