Advertisement
Guest User

Untitled

a guest
Feb 20th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.58 KB | None | 0 0
  1. int main (void) {
  2. char buf[100] = "x01x02x03x04String DataxAAxBBxCC";
  3.  
  4. return 0;
  5. }
  6.  
  7. (gdb) x /100bx buf
  8. 0x7fffffffdf00: 0x01 0x02 0x03 0x04 0x53 0x74 0x72 0x69
  9. 0x7fffffffdf08: 0x6e 0x67 0x20 0x44 0x61 0x74 0x61 0xaa
  10. 0x7fffffffdf10: 0xbb 0xcc 0x00 0x00 0x00 0x00 0x00 0x00
  11. 0x7fffffffdf18: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  12. 0x7fffffffdf20: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  13. 0x7fffffffdf28: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  14. 0x7fffffffdf30: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  15. 0x7fffffffdf38: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  16. 0x7fffffffdf40: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  17. 0x7fffffffdf48: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  18. 0x7fffffffdf50: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  19. 0x7fffffffdf58: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  20.  
  21. (gdb) x /100bs buf
  22. 0x7fffffffdf00: "01020304String Data252273314"
  23. 0x7fffffffdf13: ""
  24. 0x7fffffffdf14: ""
  25. 0x7fffffffdf15: ""
  26. 0x7fffffffdf16: ""
  27. 0x7fffffffdf17: ""
  28. ...
  29.  
  30. (gdb) dump binary memory dump.bin buf buf+100
  31.  
  32. $ xxd dump.bin
  33. 0000000: 0102 0304 5374 7269 6e67 2044 6174 61aa ....String Data.
  34. 0000010: bbcc 0000 0000 0000 0000 0000 0000 0000 ................
  35. 0000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  36. 0000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  37. 0000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  38. 0000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
  39. 0000060: 0000 0000 ....
  40.  
  41. (gdb) define xxd
  42. >dump binary memory dump.bin $arg0 $arg0+$arg1
  43. >shell xxd dump.bin
  44. >end
  45. (gdb) xxd &j 10
  46. 0000000: 0000 0000 0000 0000 0000 0000 4d8c a7f7 ............M...
  47. 0000010: ff7f 0000 0000 0000 0000 0000 c8d7 ffff ................
  48. 0000020: ff7f 0000 0000 0000
  49.  
  50. import gdb
  51. from curses.ascii import isgraph
  52.  
  53. def groups_of(iterable, size, first=0):
  54. first = first if first != 0 else size
  55. chunk, iterable = iterable[:first], iterable[first:]
  56. while chunk:
  57. yield chunk
  58. chunk, iterable = iterable[:size], iterable[size:]
  59.  
  60. class HexDump(gdb.Command):
  61. def __init__(self):
  62. super (HexDump, self).__init__ ('hex-dump', gdb.COMMAND_DATA)
  63.  
  64. def invoke(self, arg, from_tty):
  65. argv = gdb.string_to_argv(arg)
  66. if len(argv) != 2:
  67. raise gdb.GdbError('hex-dump takes exactly 2 arguments.')
  68. addr = gdb.parse_and_eval(argv[0]).cast(
  69. gdb.lookup_type('void').pointer())
  70. try:
  71. bytes = int(gdb.parse_and_eval(argv[1]))
  72. except ValueError:
  73. raise gdb.GdbError('Byte count numst be an integer value.')
  74.  
  75. inferior = gdb.selected_inferior()
  76.  
  77. align = gdb.parameter('hex-dump-align')
  78. width = gdb.parameter('hex-dump-width')
  79. if width == 0:
  80. width = 16
  81.  
  82. mem = inferior.read_memory(addr, bytes)
  83. pr_addr = int(str(addr), 16)
  84. pr_offset = width
  85.  
  86. if align:
  87. pr_offset = width - (pr_addr % width)
  88. pr_addr -= pr_addr % width
  89.  
  90. for group in groups_of(mem, width, pr_offset):
  91. print '0x%x: ' % (pr_addr,) + ' '*(width - pr_offset),
  92. print ' '.join(['%02X' % (ord(g),) for g in group]) +
  93. ' ' * (width - len(group) if pr_offset == width else 0) + ' ',
  94. print ' '*(width - pr_offset) + ''.join(
  95. [g if isgraph(g) or g == ' ' else '.' for g in group])
  96. pr_addr += width
  97. pr_offset = width
  98.  
  99. class HexDumpAlign(gdb.Parameter):
  100. def __init__(self):
  101. super (HexDumpAlign, self).__init__('hex-dump-align',
  102. gdb.COMMAND_DATA,
  103. gdb.PARAM_BOOLEAN)
  104.  
  105. set_doc = 'Determines if hex-dump always starts at an "aligned" address (see hex-dump-width'
  106. show_doc = 'Hex dump alignment is currently'
  107.  
  108. class HexDumpWidth(gdb.Parameter):
  109. def __init__(self):
  110. super (HexDumpWidth, self).__init__('hex-dump-width',
  111. gdb.COMMAND_DATA,
  112. gdb.PARAM_INTEGER)
  113.  
  114. set_doc = 'Set the number of bytes per line of hex-dump'
  115.  
  116. show_doc = 'The number of bytes per line in hex-dump is'
  117.  
  118. HexDump()
  119. HexDumpAlign()
  120. HexDumpWidth()
  121.  
  122. python
  123. sys.path.insert(0, '/path/to/module/dir')
  124. import hexdump
  125. end
  126.  
  127. (gdb) hex-dump buf 100
  128. 0x7fffffffdf00: 01 02 03 04 53 74 72 69 6E 67 20 44 61 74 61 AA ....String Data.
  129. 0x7fffffffdf10: BB CC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
  130. 0x7fffffffdf20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
  131. 0x7fffffffdf30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
  132. 0x7fffffffdf40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
  133. 0x7fffffffdf50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
  134. 0x7fffffffdf60: 00 00 00 00 ....
  135.  
  136. (gdb) set hex-dump-align on
  137. Determines if hex-dump always starts at an "aligned" address (see hex-dump-width
  138. (gdb) hex-dump &buf[5] 95
  139. 0x7fffffffdf00: 74 72 69 6E 67 20 44 61 74 61 AA tring Data.
  140. 0x7fffffffdf10: BB CC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
  141. 0x7fffffffdf20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
  142. 0x7fffffffdf30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
  143. 0x7fffffffdf40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
  144. 0x7fffffffdf50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
  145. 0x7fffffffdf60: 00 00 00 00 ....
  146.  
  147. (gdb) set hex-dump-width 8
  148. Set the number of bytes per line of hex-dump
  149. (gdb) hex-dump &buf[5] 95
  150. 0x7fffffffdf00: 74 72 69 tri
  151. 0x7fffffffdf08: 6E 67 20 44 61 74 61 AA ng Data.
  152. 0x7fffffffdf10: BB CC 00 00 00 00 00 00 ........
  153. 0x7fffffffdf18: 00 00 00 00 00 00 00 00 ........
  154. 0x7fffffffdf20: 00 00 00 00 00 00 00 00 ........
  155. 0x7fffffffdf28: 00 00 00 00 00 00 00 00 ........
  156. 0x7fffffffdf30: 00 00 00 00 00 00 00 00 ........
  157. 0x7fffffffdf38: 00 00 00 00 00 00 00 00 ........
  158. 0x7fffffffdf40: 00 00 00 00 00 00 00 00 ........
  159. 0x7fffffffdf48: 00 00 00 00 00 00 00 00 ........
  160. 0x7fffffffdf50: 00 00 00 00 00 00 00 00 ........
  161. 0x7fffffffdf58: 00 00 00 00 00 00 00 00 ........
  162. 0x7fffffffdf60: 00 00 00 00 ....
  163.  
  164. import gdb
  165. from curses.ascii import isgraph
  166.  
  167. def groups_of(iterable, size, first=0):
  168. first = first if first != 0 else size
  169. chunk, iterable = iterable[:first], iterable[first:]
  170. while chunk:
  171. yield chunk
  172. chunk, iterable = iterable[:size], iterable[size:]
  173.  
  174. class HexDump(gdb.Command):
  175. def __init__(self):
  176. super (HexDump, self).__init__ ('hd', gdb.COMMAND_DATA)
  177.  
  178. def invoke(self, arg, from_tty):
  179. argv = gdb.string_to_argv(arg)
  180.  
  181. addr = gdb.parse_and_eval(argv[0]).cast(
  182. gdb.lookup_type('void').pointer())
  183. if len(argv) == 2:
  184. try:
  185. bytes = int(gdb.parse_and_eval(argv[1]))
  186. except ValueError:
  187. raise gdb.GdbError('Byte count numst be an integer value.')
  188. else:
  189. bytes = 500
  190.  
  191. inferior = gdb.selected_inferior()
  192.  
  193. align = gdb.parameter('hex-dump-align')
  194. width = gdb.parameter('hex-dump-width')
  195. if width == 0:
  196. width = 16
  197.  
  198. mem = inferior.read_memory(addr, bytes)
  199. pr_addr = int(str(addr), 16)
  200. pr_offset = width
  201.  
  202. if align:
  203. pr_offset = width - (pr_addr % width)
  204. pr_addr -= pr_addr % width
  205. start=(pr_addr) & 0xff;
  206.  
  207.  
  208. print (' ' , end="")
  209. print (' '.join(['%01X' % (i&0x0f,) for i in range(start,start+width)]) , end="")
  210. print (' ' , end="")
  211. print (' '.join(['%01X' % (i&0x0f,) for i in range(start,start+width)]) )
  212.  
  213. for group in groups_of(mem, width, pr_offset):
  214. print ('0x%x: ' % (pr_addr,) + ' '*(width - pr_offset), end="")
  215. print (' '.join(['%02X' % (ord(g),) for g in group]) +
  216. ' ' * (width - len(group) if pr_offset == width else 0) + ' ', end="")
  217. print (' '*(width - pr_offset) + ' '.join(
  218. [chr( int.from_bytes(g, byteorder='big')) if isgraph( int.from_bytes(g, byteorder='big') ) or g == ' ' else '.' for g in group]))
  219. pr_addr += width
  220. pr_offset = width
  221.  
  222. class HexDumpAlign(gdb.Parameter):
  223. def __init__(self):
  224. super (HexDumpAlign, self).__init__('hex-dump-align',
  225. gdb.COMMAND_DATA,
  226. gdb.PARAM_BOOLEAN)
  227.  
  228. set_doc = 'Determines if hex-dump always starts at an "aligned" address (see hex-dump-width'
  229. show_doc = 'Hex dump alignment is currently'
  230.  
  231. class HexDumpWidth(gdb.Parameter):
  232. def __init__(self):
  233. super (HexDumpWidth, self).__init__('hex-dump-width',
  234. gdb.COMMAND_DATA,
  235. gdb.PARAM_INTEGER)
  236.  
  237. set_doc = 'Set the number of bytes per line of hex-dump'
  238.  
  239. show_doc = 'The number of bytes per line in hex-dump is'
  240.  
  241. HexDump()
  242. HexDumpAlign()
  243. HexDumpWidth()
  244.  
  245. (gdb) xxd hello_string 0xc
  246. 00000001_00000f87: 48 656c 6c6f 0957 6f72 Hello.Wor
  247. 00000001_00000f90: 6c64 0a ld.
  248.  
  249. define xxd
  250. dump binary memory /tmp/dump.bin $arg0 $arg0+$arg1
  251. eval "shell xxd-o %p /tmp/dump.bin", $arg0
  252. end
  253.  
  254. #!/usr/bin/env perl
  255. use IPC::Open2;
  256. $SIG{'__WARN__'} = sub{ die "$0: $!n" };
  257.  
  258. my $offset = shift // "0";
  259. $offset = oct($offset) if $offset =~ /^0/;
  260. my $base = $offset >= 2**32 ? 16 : 8;
  261.  
  262. my $zeroes = $offset % 16;
  263. my $padding = 1 + int($zeroes / 2) + 2*$zeroes;
  264. my $bytestr = "" x $zeroes;
  265. { local $/; $bytestr .= <> }
  266.  
  267. open2(*XXD_OUT, *XXD_IN, "xxd") or die "xxd is not available!";
  268. print XXD_IN $bytestr; close XXD_IN;
  269.  
  270. if ($zeroes) {
  271. $_ = <XXD_OUT>;
  272. s/^(.{50}).{$zeroes}/$1 . (' ' x $zeroes)/ge;
  273. s/^([[:xdigit:]]+:).{$padding}/$1 . (' ' x $padding)/ge;
  274. my $newoff = sprintf("%0${base}x",hex($1)+$offset) =~ s/^(.{8})(.{8})$/$1_$2/r;
  275. s/^([[:xdigit:]]+):/$newoff:/g;
  276. print
  277. }
  278. while (<XXD_OUT>) {
  279. s/^([[:xdigit:]]+)(?=:)/sprintf("%0${base}x", hex($1)+$offset-$offset%16) =~ s[^(.{8})(.{8})$][$1_$2]r/ge;
  280. print
  281. }
  282.  
  283. define xxd
  284. if $argc < 2
  285. set $size = sizeof(*$arg0)
  286. else
  287. set $size = $arg1
  288. end
  289. dump binary memory dump.bin $arg0 ((void *)$arg0)+$size
  290. eval "shell xxd -o %d dump.bin; rm dump.bin", ((void *)$arg0)
  291. end
  292. document xxd
  293. Dump memory with xxd command (keep the address as offset)
  294.  
  295. xxd addr [size]
  296. addr -- expression resolvable as an address
  297. size -- size (in byte) of memory to dump
  298. sizeof(*addr) is used by default
  299. end
  300.  
  301. (gdb) p &m_data
  302. $1 = (data_t *) 0x200130dc <m_data>
  303.  
  304. (gdb) p sizeof(m_data)
  305. $2 = 32
  306.  
  307. (gdb) xxd &m_data 32
  308. 200130dc: 0300 0000 e87c 0400 0000 0000 0100 0000 .....|..........
  309. 200130ec: 0c01 0000 b831 0020 0100 0000 0100 0000 .....1. ........
  310.  
  311. (gdb) xxd &m_data
  312. 200130dc: 0300 0000 e87c 0400 0000 0000 0100 0000 .....|..........
  313. 200130ec: 0c01 0000 b831 0020 0100 0000 0100 0000 .....1. ........
  314.  
  315. (gdb) help xxd
  316. Dump memory with xxd command (keep the address as offset)
  317.  
  318. xxd addr [size]
  319. addr -- expression resolvable as an address
  320. size -- size (in byte) of memory to dump
  321. sizeof(*addr) is used by default
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement