Short:

D=IO.read('dict').split($/).grep(/^.{#{$*[0].size}}$/)
def rate(new,old,goal,l)
  t=0; v=0; new.size.times{|i|t+=1 if new[i]!=old[i]
    v+=1 if new[i]==goal[i] }
  [ 1==t && nil==l.index(new), v ]
end
def m(a,b,l)
  l << a.dup
  if a==b then p l; exit; end
  D.inject([]){|w,x| y,v = rate(x,a,b,l)
    w << [v,x] if y ; w
  }.sort.reverse_each{|v,x| m(x,b,l) }
end
m($*[0], $*[1], [])