diff --git a/README.md b/README.md
index a3fd7cd..29d6345 100644
--- a/README.md
+++ b/README.md
@@ -21,3 +21,7 @@ Similarly, debug commands may be passed as command-line arguments to `synacor.py
For example, to load the `dumps/init` state to skip the self-test and decryption, run:
./synacor.py dbg_load dumps/init
+
+Dump files are stored in Python [pickle](https://docs.python.org/3/library/pickle.html) format, so if you want to inspect the memory in a hex editor, for example, it will be necessary to extract a raw memory dump:
+
+ ./tools/dump_to_raw.py dumps/init dumps/init.raw
diff --git a/tools/dump_to_raw.py b/tools/dump_to_raw.py
new file mode 100755
index 0000000..f818a8b
--- /dev/null
+++ b/tools/dump_to_raw.py
@@ -0,0 +1,31 @@
+#!/usr/bin/env python3
+# synacor.py - An implementation of the Synacor Challenge
+# Copyright © 2016 RunasSudo
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+
+import pickle
+import struct
+import sys
+
+if len(sys.argv) < 3:
+ print('Usage: {}