A great hacker demonstrates deep understanding.
When you encounter a problem in your program, is your first question "How to I make it stop doing that?" or is it "Why is it doing that?".
If you ask the former, you'll never be a great hacker because you have the wrong mindset. The great hacker strives to know not just WHAT it is, but WHY it is. The deep understanding that results from such an approach gives the great hacker a massive edge because he'll see opportunities that nobody else can, and will know off the bat what the fallout will be for any proposed solution to a problem.
The great hacker reads tech manuals for fun. He picks up strange, esoteric knowledge because it's interesting. This trains his brain to pick new things up quickly, and discover patterns in anything he examines or does.
The great hacker's code is as simple and elegant and readable as possible. When you look at it, it all seems so easy. And yet anyone else would have written something far more complex and error prone.
A great hacker is a craftsman. His code is functional art. He looks back on his work with a critical eye, searching for flaws. That being said, real artists ship.