linux 机器码转汇编_linux查看汇编机器码 - CSDN
  • 使用点亮LED的简单程序分析其汇编码和机器码,通过直接修改bin文件中的机器码修改功能,点亮其他的LED灯。 首先修改Makefile文件把elf文件反汇编生成dis文件,查看其真正的汇编指令: all: arm-linux-gcc -c -o ...

    使用点亮LED的简单程序分析其汇编码和机器码,通过直接修改bin文件中的机器码修改功能,点亮其他的LED灯。

    首先修改Makefile文件把elf文件反汇编生成dis文件,查看其真正的汇编指令:

    all:
    	arm-linux-gcc -c -o Led_on.o Led_on.S
    	arm-linux-ld -Ttext 0 Led_on.o -o Led_on.elf
    	arm-linux-objcopy -O  binary -S  Led_on.elf Led_on.bin
    	arm-linux-objdump -D Led_on.elf > Led_on.dis
    
    clean:
    	rm *.bin *.o *.elf

    反汇编之后打开dis文件,真正的汇编指令:

    Led_on.elf:     file format elf32-littlearm
    
    Disassembly of section .text:
    
    00000000 <_start>:
    /*[第1行]*/   0:	e59f1014 	ldr	r1, [pc, #20]	; 1c <.text+0x1c>
    /*[第2行]*/   4:	e3a00c01 	mov	r0, #256	; 0x100
    /*[第3行]*/   8:	e5810000 	str	r0, [r1]
    /*[第4行]*/   c:	e59f100c 	ldr	r1, [pc, #12]	; 20 <.text+0x20>
    /*[第5行]*/  10:	e3a00000 	mov	r0, #0	; 0x0
    /*[第6行]*/  14:	e5810000 	str	r0, [r1]
    
    00000018 <halt>:
      18:	eafffffe 	b	18 <halt>
      1c:	56000050 	undefined
      20:	56000054 	undefined

    在汇编指令中,最右边是汇编码,中间是机器码,最左边是地址。

                                                                    

    在cpu中有27个寄存器,其中16个可以使用,如上图所示,最右边一列是寄存器的别名。其中pc为Program counter程序计数器,当把一个地址写入此寄存器中时,程序就跳到此地址中去。lr是link register链接寄存器,用来保存返回地址,当程序执行完后调回到这个地址。sp是stack point栈指针寄存器。

    程序解析过程说明:

    /*[第1行]*/   0:    e59f1014     ldr    r1, [pc, #20]    ; 1c <.text+0x1c> 在这一行程序中,当前指令地址为0,pc为当前指令地址加8,所以r1 = 0 + 8 + 20 = 28 = 0x1c,但是为什么是加8?因为在ARM系统中cpu是以流水线(ARM内核使得执行效率更加高)的方式进行工作的,即当前执行地址A的指令,那么cpu已经在对地址A+4的指令进行译码,同时已经在读取地址A+8的指令,这里A+8就是pc的值。所以在下边已经给出了0x1c地址的值就是56000050,赋给r1。

    /*[第2行]*/   4:    e3a00c01     mov    r0, #256    ; 0x100  在这一行中,mov指令将立即数0x100赋给r0

    /*[第3行]*/   8:    e5810000     str    r0, [r1]   在这一行将0x100写入r1对应的内存
    /*[第4行]*/   c:    e59f100c     ldr    r1, [pc, #12]    ; 20 <.text+0x20> 在这一行中pc等于当前地址加8,所以r1=pc + 12 = 0xc + 8 + 12 =32=0x20,所以下边已经给出此地址的值为56000054,读取出来赋给r1。
    /*[第5行]*/  10:    e3a00000     mov    r0, #0    ; 0x0 在这一行中将立即数赋给r0。
    /*[第6行]*/  14:    e5810000     str    r0, [r1] 在这一行将0写入r1对应的内存

    编译器将汇编码转换为机器码,这个机器码就是bin文件的内容。如果想将点亮的第一个LED灯换成第二个,经过查阅手册将GPFCON赋值改为0x400,可以通过修改汇编程序然后编译链接,但是也可以通过修改机器码来实现,就是修改第二行的MOV指令对应的机器码,首先查阅MOV指令机器码存储结构。

                                  

    e3a00c01     mov    r0, #256

    e3a00c01的位: 

    bit15~bit12用来表示r0,bit11~bit0用来表示赋值的数值立即数。其中bit11~bit8表示高四位rotate,剩下的是低8位immed_8。而立即数 = immed_8循环右移(2 * rotate)位。

    根据上图rotate是12,所以是1循环右移24位得到0..(23)..100000000也就是立即数0x100

    但是如果是立即数是0x400,怎么使用rotate和immed_8表示呢,将0x400展开是0..(21)..100 0000 0000数一下0的个数可知道是1循环右移22位得到,所以ratate=22/2=11,rotate为0b1011,所以12位立即数为1011 0000 0001,所以直接修改机器码e3a00c01为e3a00b01即可解决问题。

     

     

     

     

     

     

     

    展开全文
  • 由于要在PE文件中修改代码,本质上是在改十六进制的机器码(shellcode为经过处理的机器码),而我们阅读的是汇编码,汇编码和机器码相互转化可以更好的修改程序。本来想用pwn tool或OllyDbg来转化,但通过搜索linux的...

    由于要在PE文件中修改代码,本质上是在改十六进制的机器码(shellcode为经过处理的机器码),而我们阅读的是汇编码,汇编码和机器码相互转化可以更好的修改程序。本来想用pwn toolOllyDbg来转化,但通过搜索linux的调试工具,radare2有附加的工具来转化。

    (1) radare2安装
    apt install radare2
    

    Windows下载地址:http://radare.mikelloc.com/list,下载zip包,install的安装后无法使用,这边使用radare2-msvc_64-3.9.0.ziphttps://github.com/radareorg/radare2/releases/tag/3.2.1有32/64位的zip包。
    github:https://github.com/radareorg/radare2/issues/12799

    ra+TAB显示相关的命令:

    rabin2.exe    radiff2.exe   ragg2.exe     ranlib.exe    rasautou.exe  raserver.exe  rasphone.exe
    radare2.exe   rafind2.exe   rahash2.exe   rarun2.exe    rasdial.exe   rasm2.exe     rax2.exe
    
    (2) 转化
    rasm2 -L    #查看architectures
    rasm2 -a x86 -b 32 'mov eax, 33'    #转机器码
    echo 'push eax;nop;nop' | rasm2 -f -   
    
    rasm2 -a x86 -d 55  #转汇编 push ebp
    
    (3) radare2使用

    radare2用于静态分析,用radare2 -d C:\Windows\System32\notepad.exe来动态调试,但在windows上调试功能不完善,基本上无法调试。

    radare2 静态分析

    crackme程序下载:https://github.com/radareorg/radare2book/blob/master/crackmes/ioli/IOLI-crackme.tar.gz

    分析符号

    r2 -A crackme0x00.exe
    

    r2命令行下用aaa(analyze)来分析

    查看帮助:? a? d? i? p?

    a = analyze

    d = Debug|Display

    i = info

    p = print

    查看函数

    pdf @ main  #或地址
    
    ii  #导入表
    iE  #导出表
    

    进入地址

    s 0x00401303    #seek
    

    查看二进制信息

    iI
    

    查看汇编码

    pd 9    #前9行
    

    查看寄存器

    dr
    dr eax
    

    数值计算

    ? eax
    ? 0x00401260
    ? 0x45-12
    

    计算汇编码

    pa push ebp;    #汇编
    paD 55          #反汇编 pad 55
    

    计算hash

    ph
    

    图形界面

    v   #q退出
    

    环境变量

    e asm.cpu=x86
    

    c源码

    pdc
    
    (4) 快速进入radare2
    radare2 -
    

    修改内存

    w a #写入字符
    x   #查看hex x?=px?
    
    wx 55 @ 0x01    #在0x01写入机器码55
    x
    pd 5    #查看前5行汇编码
    
    wa push eip;    #写入汇编码
    
    wb 00   #循环填充00 即全部清零
    x
    
    (5) radare2图形界面:cutter

    cutter下载地址https://github.com/radareorg/cutter

    cutter的UI用Qt5写,radare2成为库函数

    打开cutter,在Windows\console可以打开r2命令行。由于终端经过IO重定向,如果使用v等死循环的命令时会卡UI。

    (6) radare2附加的工具

    rax2 数值计算

    rax2 45+0x12
    rax2 -s 4142    #AB
    rax2 -S AB  #4142
    rax2 -S < bin.foo
    

    rafind2 查找

    rafind2 -s lib /bin/ls  #search for a specific string
    rafind2 -z /bin/ls  #search for zero-terminated strings
    

    rarun2 环境变量设置

    rabin2 文件属性

    rabin2 -I /bin/ls   #info
    

    radiff2 比较

    rasm2 汇编|反汇编

    rasm2 -L    #列出架构
    rasm2 -a x86 -b 32 'mov eax, 33'    #汇编
    rasm2 -a x86 -b 32 -d '90'  #反汇编
    

    ragg2 构造注入

    rahash2 哈希算法

    rahash2 -a md5 -s "hello world"
    rahash2 -B 1M -b -a sha256 /bin/ls
    
    (7) 参考
    展开全文
  • 机器码的指令字,用文本文件保存,将指令字保存成.S文件,如下格式: .inst 0xf9440e11 .inst 0x9120a210 (1) 用对应架构的的汇编器,编译成目标文件。命令:as a.s -o a.out (2)用objdump反汇编,生成...

    将机器码的指令字,用文本文件保存,将指令字保存成.S文件,如下格式:

    .inst  0xf9440e11
    .inst  0x9120a210

    (1) 用对应架构的的汇编器,编译成目标文件。命令:as a.s -o a.out

    (2)用objdump反汇编,生成汇编语句。命令:objdump -d a.out

     

    实践:

    [82#yuchen@ubuntu ~]# cat a.s 

    .inst  0xf9440e11
    .inst  0x9120a210
    [83#yuchen@ubuntu ~]# aarch64_be-linux-gnu-as a.s 
    [84#yuchen@ubuntu ~]# aarch64_be-linux-gnu-objdump -d a.out 

    a.out:     file format elf64-bigaarch64


    Disassembly of section .text:

    0000000000000000 <.text>:
       0:   f9440e11        ldr     x17, [x16,#2072]
       4:   9120a210        add     x16, x16, #0x828

    [85#yuchen@ubuntu ~]# 

    展开全文
  • linux汇编机器码对照

    千次阅读 2012-01-31 08:32:31
    objdump --disassemble --show-raw-insn filename 这样可以把汇编机器码一起打印
    objdump --disassemble --show-raw-insn filename 这样可以把汇编和机器码一起打印
    
    展开全文
  • 在看《自己动手写CPU》的时候,里面需要将MIPS转换成机器码作为输入的指令,不过书上的工具以及一些步骤在实际中是不能用的,因此在这里将“从MIPS汇编转换成机器码”的完整过程下来 安装Linux虚拟机 因为汇编工具...
  • 虽然机器码和内存地址领证在一起了,但是俩个人都和汇编指令有着说不清的关系,机器码的前任是汇编指令,而汇编指令又与内存地址暗地相通,这究竟是道德的沦丧还是人性的扭曲,今天就让我来领大家细细分解这三者的...
  • Preface:HI,欢迎进入Assembly Language into Mechine Code 教程...... Content:作者:HSLY 网站:http://www.x86asm.com E-MAIL: pliceman_110@163.comHI,欢迎进入Assembly Language into Mechine Code 教程... 首
  • arm汇编指令与机器码对应分析

    千次阅读 2019-10-15 14:57:47
    我们编写的汇编程序还是不够底层,CPU都是对机器码进行操作的,所以还需要用汇编器将汇编代码转换成机器码才能被CPU处理。下面举几个例子来说说分析ARM机器码的方法。  对编译连接之后得到的ELF进行反汇编:arm-...
  • 常用arm汇编指令 1.1 ldr,读地址指令 ldr R0,[R1] 假设R1的值是x,那么这条语句:读地址x上的数据(4字节),保存到R0中 1.2 str,写地址指令 str R0,[R1] 假设R1的值是x,把R0的值写到地址x(4字节) ...
  • 汇编指令和机器码的对应表

    千次阅读 2016-08-01 11:45:01
    原文地址::... ...1、汇编对应机器码大全----http://wenku.baidu.com/link?url=GeRgqDNM40TlJtIz2RCWGd8o1uCeLCT_ZJ3d4wNA_ZQm_7uGcJ7YF3JKV8_lyFNYoRIYs3ue7-8
  • 汇编指令机器码对应列表

    千次阅读 2019-04-03 21:22:47
    指令集依照机器操作汇编助记符和汇编操作数来描述指令,遵循下列约定: l reg8: 8位寄存器。 l reg16: 16位寄存器。 l mem8: 8位内存数值。 l mem16: 16位内存数值。 l immed8: 8位立即数值。 l ...
  • 高级语言需通过编译生成了汇编语言 汇编语言包含指令 和 伪指令(为了编程方便,对部分指令做的封装),如mov,inc等 ...[初步理解]不同操作系统(Windows,Linux)机器码文件头不同??还是不同CPU机器码文件不同
  • jmp指令对应的机器码

    千次阅读 2015-07-31 16:31:04
    od随便打开一个记事本,汇编几条jmp指令,可以看到如下 地址 HEX 反汇编 010073B4 - E9 7B9E8787 JMP 88881234 010073B9 - E9 769E8787 JMP 88881234 010073BE - E9 719E8787 JMP 8888123
  • 汇编语言编写Linux内核模块

    千次阅读 2020-05-30 12:06:09
    我曾经是一个用Java写过界面的人,我也是一个直接用机器码打开别人开不了机的人,我是一个不懂UML但曾经动用过改锥编程的人,至少我崇拜那样的人。 本文,我来展示一个用汇编写的Linux内核模块,没有gcc生成的...
  • 图片来自韦东山嵌入式linux开发手册P44
  • ARM机器码分析

    2015-07-20 23:00:00
    我们编写的汇编程序还是不够底层,CPU都是对机器码进行操作的,所以还需要用汇编器将汇编代码转换成机器码才能被CPU处理。下面举几个例子来说说分析ARM机器码的方法。  对编译连接之后得到的ELF进行反汇编:arm-...
1 2 3 4 5 ... 20
收藏数 23,404
精华内容 9,361
关键字:

linux 机器码转汇编