Linux 下使用 objdump 反汇编

objdump有点象那个快速查看之流的工具,就是以一种可阅读的格式让你更多地了解二进制文件可能带有的附加信息。对于一般只想让自己程序跑起来的程序员,这个命令没有更多意义,对于想进一步了解系统的程序员,应该掌握这种工具,至少你可以自己写写shellcode了,或者看看人家给的exploit中的shellcode是什么东西。目录:★ 测试练习前的准备工作★ RedHat 6.0 objdump命令的man手册★ objdump应用举例(待增加)★ 相关命令★ 测试练习前的准备工作cp /usr/lib/libpcap.a /home/scz/srcnm -s libpcap.a | morear tv libpcap.aar xv libpcap.a inet.onm -s inet.o关于nm -s的显示请自己man nm查看

★ Redhat 6.0 objdump命令的man手册objdump – 显示二进制文件信息objdump[-a] [-b bfdname |–target=bfdname] [-C] [–debugging][-d] [-D][–disassemble-zeroes][-EB|-EL|–endian={big|little}] [-f][-h] [-i|–info][-j section | –section=section][-l] [-m machine ] [–prefix-addresses][-r] [-R][-s|–full-contents] [-S|–source][–[no-]show-raw-insn] [–stabs] [-t][-T] [-x][–start-address=address] [–stop-address=address][–adjust-vma=offset] [–version] [–help]objfile…–archive-headers-a 显示档案库的成员信息,,与 ar tv 类似objdump -a libpcap.a 和 ar -tv libpcap.a 显示结果比较比较显然这个选项没有什么意思。–adjust-vma=offsetWhendumping information, first add offset to all the section addresses.This is useful if the section addresses do not correspond to the symboltable, which can happen when putting sections at particular addresseswhen using a format which can not represent section addresses, such asa.out.-b bfdname–target=bfdname指定目标码格式。这不是必须的,objdump能自动识别许多格式,比如:objdump -b oasys -m vax -h fu.o显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys编译器生成的目标文件。objdump -i将给出这里可以指定的目标码格式列表–demangle-C 将底层的符号名解码成用户级名字,除了去掉所有开头的下划线之外,还使得C++函数名以可理解的方式显示出来。–debugging显示调试信息。企图解析保存在文件中的调试信息并以C语言的语法显示出来。仅仅支持某些类型的调试信息。–disassemble-d 反汇编那些应该还有指令机器码的section–disassemble-all-D 与 -d 类似,但反汇编所有section–prefix-addresses反汇编的时候,显示每一行的完整地址。这是一种比较老的反汇编格式。显示效果并不理想,但可能会用到其中的某些显示,自己可以对比。–disassemble-zeroes一般反汇编输出将省略大块的零,该选项使得这些零块也被反汇编。-EB-EL–endian={big|little}这个选项将影响反汇编出来的指令。little-endian就是我们当年在dos下玩汇编的时候常说的高位在高地址,x86都是这种。–file-headers-f 显示objfile中每个文件的整体头部摘要信息。–section-headers–headers-h 显示目标文件各个section的头部摘要信息。–help 简短的帮助信息。–info-i 显示对于 -b 或者 -m 选项可用的架构和目标格式列表。–section=name-j name 仅仅显示指定section的信息–line-numbers-l 用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。–architecture=machine-m machine指定反汇编目标文件时使用的架构,当待反汇编文件本身没有描述架构信息的时候(比如S-records),这个选项很有用。可以用-i选项列出这里能够指定的架构–reloc-r 显示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反汇编后的格式显示出来。–dynamic-reloc-R 显示文件的动态重定位入口,仅仅对于动态目标文件有意义,比如某些共享库。–full-contents-s 显示指定section的完整内容。objdump –section=.text -s inet.o | more–source-S 尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。–show-raw-insn反汇编的时候,显示每条汇编指令对应的机器码,除非指定了–prefix-addresses,这将是缺省选项。–no-show-raw-insn反汇编时,不显示汇编指令的机器码,这是指定 –prefix-addresses选项时的缺省设置。–stabsDisplaythe contents of the .stab, .stab.index, and .stab.excl sections from anELF file. This is only useful on systems (such as Solaris 2.0) in which.stab debugging symbol-table entries are carried in an ELF section. Inmost other file formats, debugging symbol-table entries are interleavedwith linkage symbols, and are visible in the –syms output.–start-address=address从指定地址开始显示数据,该选项影响-d、-r和-s选项的输出。–stop-address=address显示数据直到指定地址为止,该选项影响-d、-r和-s选项的输出。–syms-t 显示文件的符号表入口。类似于nm -s提供的信息–dynamic-syms-T 显示文件的动态符号表入口,仅仅对动态目标文件有意义,比如某些共享库。它显示的信息类似于 nm -D|–dynamic 显示的信息。–version 版本信息objdump –version–all-headers-x 显示所有可用的头信息,包括符号表、重定位入口。-x 等价于-a -f -h -r -t 同时指定。objdump -x inet.o参看 nm(1)★ objdump应用举例(待增加)/*g++ -g -Wstrict-prototypes -Wall -Wunused -o objtest objtest.c*/#include#includeint main ( int argc, char * argv[] ){execl( “/bin/sh”, “/bin/sh”, “-i”, 0 );return 0;}g++ -g -Wstrict-prototypes -Wall -Wunused -o objtest objtest.cobjdump -j .text -Sl objtest | more/main(查找)08048750 :main():/home/scz/src/objtest.c:7*/#include#includeint main ( int argc, char * argv[] ){8048750: 55 pushl %ebp8048751: 89 e5 movl %esp,%ebp/home/scz/src/objtest.c:8execl( “/bin/sh”, “/bin/sh”, “-i”, 0 );8048753: 6a 00 pushl $0x08048755: 68 d0 87 04 08 pushl $0x80487d0804875a: 68 d3 87 04 08 pushl $0x80487d3804875f: 68 d3 87 04 08 pushl $0x80487d38048764: e8 db fe ff ff call 8048644 8048769: 83 c4 10 addl $0x10,%esp/home/scz/src/objtest.c:9return 0;804876c: 31 c0 xorl %eax,%eax804876e: eb 04 jmp 80487748048770: 31 c0 xorl %eax,%eax8048772: eb 00 jmp 8048774/home/scz/src/objtest.c:10}8048774: c9 leave8048775: c3 ret8048776: 90 nop如果说上面还不够清楚,可以用下面的命令辅助一下:objdump -j .text -Sl objtest –prefix-addresses | moreobjdump -j .text -Dl objtest | more去掉调试编译选项重新编译g++ -O3 -o objtest objtest.cobjdump -j .text -S objtest | more08048778 :main():8048778: 55 pushl %ebp8048779: 89 e5 movl %esp,%ebp804877b: 6a 00 pushl $0x0804877d: 68 f0 87 04 08 pushl $0x80487f08048782: 68 f3 87 04 08 pushl $0x80487f38048787: 68 f3 87 04 08 pushl $0x80487f3804878c: e8 db fe ff ff call 804866c 8048791: 31 c0 xorl %eax,%eax8048793: c9 leave8048794: c3 ret8048795: 90 nop与前面-g编译后的二进制代码比较一下,有不少区别。至于如何写shellcode、如何理解别人给出的shellcode,请参看华中站系统安全版精华区中的”如何写自己的shellcode”★ 相关命令man objcopyman nmman gdb | dbx | sdb

夫妇一条心,泥土变黄金。

Linux 下使用 objdump 反汇编

相关文章:

你感兴趣的文章:

标签云: