With a snapshot, your virtualization software has to keep track of four things: CPU state, RAM, configuration (how many network cards in the VM?), and disk. I'm ignoring the first three things because they're not huge amounts of data, the software can just make copies of the relatively small data structures and store them in a file. So, that leaves only the disk snapshotting to explain.
First off, what the VM sees as a hard disk is really just a set of files on the host file system. To do a snapshot, the virtual machine software takes the VM's disk at a certain point in time, preserves it, opens a new empty disk file, and does a copy-on-write scheme with every subsequent disk access.
Let's say your disk file is BigVM.disk. You snapshot and now your VM software renames your disk to BigVM-s1.disk, then makes a new empty BigVM.disk. When your VM is running, all read requests go through BigVM.disk. If that file does not have an entry for the part of the disk your VM wants, then the data from BigVM-s1.disk is returned. On a write, the data is written to BigVM.disk instead of BigVM-s1.disk. A future read to that same sector will return the data from BigVM.disk instead of the original snapshot contained in BigVM-s1.disk. BigVM-s1.disk contains your VM's hard disk state as of your snapshot, while BigVM.disk contains all the diffs to your disk since that snapshot.
What happens when you revert to an older snapshot? The VM software throws away the contents of BigVM.disk and starts over, with a new empty BigVM.disk which still points at BigVM-s1.disk.