_                _   _                 ____            _     _ 	
   / \   _ __   ___ | |_| |__   ___ _ __  |  _ \ _ __ ___ (_) __| |	
  / _ \ | '_ \ / _ \| __| '_ \ / _ \ '__| | | | | '__/ _ \| |/ _\` |	
 / ___ \| | | | (_) | |_| | | |  __/ |    | |_| | | | (_) | | (_| |	
/_/   \_\_| |_|\___/ \__|_| |_|\___|_|    |____/|_|  \___/|_|\__,_|	
                                                                bbs
  XQTRs lair...
Home // Blog // NULL emag. // Files // Docs // Tutors // GitHub repo
https://www.rationallyparanoid.com/articles/dd-hex-editor.html                  
How to use dd as a hex editor                                 April 13, 2010    
                                                                                
WARNING: All commands should be tested first or performed on copies of the      
files using an account with minimal privileges. A slip-up while using dd with   
a root account can have a significant impact on your system. Author is not      
liable for any damages resulting from inaccuracies or mistakes within this      
page.                                                                           
                                                                                
dd can be used much like a hex editor to perform low-level file-content         
editing, but through a command-line instead of a GUI. This can be useful in     
cases where you have shell access to a system and need to edit binary files     
on the spot.                                                                    
                                                                                
In this tutorial the target file will be a 64 byte block of null characters     
called "64zero". Its contents is the following:                                 
                                                                                
user@linux:~$ xxd 64zero                                                        
0000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
                                                                                
We will also use 2 input files. One called a.txt that consists of 16 bytes of   
the ASCII value A:                                                              
                                                                                
user@linux:~$ xxd a.txt                                                         
0000000: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA               
                                                                                
And the other called b.txt which is a 16 byte string of the ASCII values        
A to P:                                                                         
                                                                                
user@linux:~$ xxd b.txt                                                         
0000000: 4142 4344 4546 4748 494a 4b4c 4d4e 4f50 ABCDEFGHIJKLMNOP               
                                                                                
In every example we will show you the command required to perform the desired   
action, and demonstrate the results. Although it is not as efficient from a     
performance perspective, a block size of 1 is specified in each example for     
the sake of simplicity.                                                         
                                                                                
Overwrite 1 byte of data in target file 64zero at offset 0 (i.e. the beginning  
of the file) with random data:                                                  
                                                                                
user@linux:~$ dd if=/dev/urandom count=1 bs=1 of=64zero conv=notrunc            
1+0 records in                                                                  
1+0 records out                                                                 
user@linux:~$ xxd 64zero                                                        
0000000: 5200 0000 0000 0000 0000 0000 0000 0000 R...............               
0000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
                                                                                
                                                                                
Overwrite 1 byte of data in target file 64zero at offset 8 with random data:    
                                                                                
user@linux:~$ dd if=/dev/urandom count=1 bs=1 seek=8 of=64zero conv=notrunc     
1+0 records in                                                                  
1+0 records out                                                                 
user@linux:~$ xxd 64zero                                                        
0000000: 0000 0000 0000 0000 d500 0000 0000 0000 ................               
0000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
                                                                                
                                                                                
Overwrite 4 bytes of data in target file 64zero starting at offset 8 with       
random data:                                                                    
                                                                                
user@linux:~$ dd if=/dev/urandom count=4 bs=1 seek=8 of=64zero conv=notrunc     
4+0 records in                                                                  
4+0 records out                                                                 
user@linux:~$ xxd 64zero                                                        
0000000: 0000 0000 0000 0000 edd7 0128 0000 0000 ...........(....               
0000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
                                                                                
                                                                                
Overwrite 4 bytes of data in target file 64zero starting at offset 8 with the   
contents of a.txt:                                                              
                                                                                
user@linux:~$ dd if=a.txt count=4 bs=1 seek=8 of=64zero conv=notrunc            
4+0 records in                                                                  
4+0 records out                                                                 
user@linux:~$ xxd 64zero                                                        
0000000: 0000 0000 0000 0000 4141 4141 0000 0000 ........AAAA....               
0000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
                                                                                
                                                                                
Overwrite data in target file 64zero starting at offset 8 with the entire       
contents of a.txt:                                                              
                                                                                
user@linux:~$ dd if=a.txt bs=1 seek=8 of=64zero conv=notrunc                    
16+0 records in                                                                 
16+0 records out                                                                
user@linux:~$ xxd 64zero                                                        
0000000: 0000 0000 0000 0000 4141 4141 4141 4141 ........AAAAAAAA               
0000010: 4141 4141 4141 4141 0000 0000 0000 0000 AAAAAAAA........               
0000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
                                                                                
                                                                                
Overwrite data in target file 64zero starting at offset 0 with the entire       
contents of a.txt:                                                              
                                                                                
user@linux:~$ dd if=a.txt of=64zero conv=notrunc                                
0+1 records in                                                                  
0+1 records out                                                                 
user@linux:~$ xxd 64zero                                                        
0000000: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA               
0000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
                                                                                
                                                                                
Overwrite data in target file 64zero starting at offset 8 with 1 byte of b.txt  
after skipping the first 3 bytes of b.txt:                                      
                                                                                
user@linux:~$ dd if=b.txt skip=3 seek=8 bs=1 count=1 of=64zero conv=notrunc     
1+0 records in                                                                  
1+0 records out                                                                 
user@linux:~$ xxd 64zero                                                        
0000000: 0000 0000 0000 0000 4400 0000 0000 0000 ........D.......               
0000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
                                                                                
                                                                                
Overwrite data in target file 64zero starting at offset 8 with 2 byte of b.txt  
after skipping the first 3 bytes of b.txt:                                      
                                                                                
user@linux:~$ dd if=b.txt skip=3 seek=8 bs=1 count=2 of=64zero conv=notrunc     
2+0 records in                                                                  
2+0 records out                                                                 
user@linux:~$ xxd 64zero                                                        
0000000: 0000 0000 0000 0000 4445 0000 0000 0000 ........DE......               
0000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
                                                                                
                                                                                
Append entire contents of b.txt to the end of target file 64zero:               
                                                                                
user@linux:~$ dd if=b.txt of=64zero oflag=append conv=notrunc                   
0+1 records in                                                                  
0+1 records out                                                                 
user@linux:~$ xxd 64zero                                                        
0000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000040: 4142 4344 4546 4748 494a 4b4c 4d4e 4f50 ABCDEFGHIJKLMNOP               
                                                                                
                                                                                
Overwrite data in the target file 64zero starting at offset 16 with entire      
contents of b.txt. Truncate the output file:                                    
                                                                                
user@linux:~$ dd if=b.txt seek=16 bs=1 of=64zero                                
16+0 records in                                                                 
16+0 records out                                                                
user@linux:~$ xxd 64zero                                                        
0000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................               
0000010: 4142 4344 4546 4748 494a 4b4c 4d4e 4f50 ABCDEFGHIJKLMNOP