The way I have been working on legacy code is to get your hands dirty, as Junilu said one way is to refactor and
test. If you are trying to understand the complete system in one go, that would be difficult. You can deal with the code on an usecase basis.
So you pick one usecase and play around with the code which is created for that usecase. Generally usecase would be a set of actions in the system, so you can go into the code and look for the code associated with those actions.
Also if there are people in the team who have worked on the system, you can get some knowledge by interacting with them. You can also run through the usecases with the stakeholders and correct your understanding about the usecases.
The approach mentioned by Junilu is referred to as -
The Boy Scout Rule.