首页 > 编程语言 >逆向——汇编中的位运算

逆向——汇编中的位运算

时间:2023-04-05 17:12:39浏览次数:50  
标签:右移 逆向 10000001 运算 汇编 左移 al CF printf

 

汇编中的移位指令

1、算术移位指令

  • SAL(Shift Arithmetic Left):算术左移

  • SAR(Shift Arithmetic Right):算术右移

  • 格式:SAL/SAR Reg/Mem, CL/Imm

即算数移位指令后面的第一个操作数是寄存器或者内存;

第二个操作数是寄存器或者立即数

SAL eax,2
SAL ax,1
SAL al,3


举例:
SAR al,1         //al:10000001右移一位最高位补原来符号位,最低位移入CF,即11000000 / CF:1
SAL al,2         //al:10000001左移两位最高位移入CF,最低位补0,即00000100 /  CF:0

2.逻辑移位指令

 

  • SHL(Shift Left):逻辑左移

  • SHR(Shift Right):逻辑右移

  • 格式:SHL/SHR Reg/Mem, CL/Imm

    SHL eax,2
    SHR word ptr es:[ebp],1
    SHL al,1

    举例:
    SHR al,1         //al:10000001右移一位最高位补0,最低位移入CF,即01000000 /  CF:1
    SHL al,1         //al:01000001左移一位最高位移入CF,最低位补0,即10000010 /  CF:0

     

3.循环移位指令

 

  • ROL(Rotate Left):循环左移

  • ROR(Rotate Right):循环右移

  • 格式:ROL/ROR r/m, i8/CL

    ROL eax,3
    ROL cx,1
    ROR cl,2

    举例
    ROL al,1   //al:10000001循环左移一位最高位补到最低位,最高位移入CF,即00000011 /  CF:1
    ROR al,1   //al:10000001循环右移一位最低位补到最高位,最低位移入CF,即11000000 /  CF:1

4.带进位的循环移位指令

 

  • RCL(Rotate through Carry Left):带进位循环左移

  • RCR(Rotate through Carry Right):带进位循环右移

  • 格式:RCL/RCR r/m, i8/CL

RCL eax,1
RCR cx,2
RCR al,1

举例:
RCL al,1 //al:10000001,CF:0循环左移一位最高位移入CF,CF原来的数补到最低位,即al:00000010 / CF:1
RCR al,1 //al:10000001,CF:0循环右移一位最低位移入CF,CF原来的数补到最高位,即al:01000000 / CF:1

C语言中的移位运算

与运算 &

printf("%d",2&3); //2

或运算 |

printf("%d",2|3); //3

非运算 ~

printf("%d",~2); //-3,因为%d打印的是有符号的整数

异或运算 ^

printf("%d",2^3); //1

移位运算 << >>

左移运算,有符号和无符号是无区别的

int a = 8;
printf("%d",a<<1);  //16
unsigned int b = 8;
printf("%d",b<<1);  //16

查看反汇编:生成的汇编指令都是shl,逻辑左移

img

右移运算,有符号对应SAR即算数右移,无符号对应SHR即逻辑右移

int a = 0xF0000000;
printf("%d",a>>1);  //-134217728
unsigned int b = 0xF0000000;
printf("%d",b>>1);  //2013265920

查看反汇编:有符号右移生成的指令为SAR,无符号右移生成的指令为SHR

img

作业

 

复制代码
#include "stdafx.h"
​
​
    void Function_1_1()     
    {
            unsigned char x=0xf5,y=0xff;
            int i;
            scanf("%d",&i);
        /*  if((x=x&(y<<i))==0)
                (printf("第%d位是0",i+1));
            else
                (printf("第%d位是1",i+1));
*/
    printf("第%d位是%x",i,x=x&(y>>(8-i))); 
        //  printf("%x",x);
            
    }       
​
​
​
int main()
{           
​
        Function_1_1();             
​
    return 0;
​
}
 
复制代码

 

  • 用十六进制文本编辑器分别打开一个.exe、.dll、.sys、.txt、.doc、.jpg、.pdf等将前两个字节写在下面

.exe:内存中显式为4D 5A,我们读作0x5A4D .dll:同样是4D 5A .sys:4D 5A开头,但也有25 75 .txt:0A 66,读作0x660A .doc:D0 CF,读作0xCFD0 .jpg:FF D8 .pdf:25 50,读作0x5025

  • 将一个在十六进制编辑器中打开的.exe文件,拖拽到最后,观察文件中的大小和硬盘上的大小

可以发现用十六进制编辑器打开一个.exe文件,它的最大地址0x0829CDF0,换算成10进制,就刚好等于这个文件的大小136957440字节 img

  分类: 逆向-PE

标签:右移,逆向,10000001,运算,汇编,左移,al,CF,printf
From: https://www.cnblogs.com/bonelee/p/17289823.html

相关文章

  • 王爽汇编 课程设计1
    代码部分任务:将实验7中的Poweridea公司的数据按照下图显示出来用时3天。代码行为240行左右。小结:在一个模块中,使用了全局的四个寄存器,ax,bx,cx,dx务必要使用成对的push-pop相等恢复,不然出现的出错在代码量大了后很难发现如下:是进行一个si寄存器值的除2,因为在写代......
  • 汇编第三章复习之七种寻址
    段寄存器:CS、DS、ES、SS1.指令指令由操作数码和操作数两部分构成操作码:说明计算机要执行的操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分。    操作数:是指令执行的参与者,即各种操作的对象。也就是指令执行操作过程中需要的操作数。2、寻址 1、......
  • 逍遥自在学C语言 | 关系运算符
    前言一、人物简介第一位闪亮登场,有请今后会一直教我们C语言的老师——自在。第二位上场的是和我们一起学习的小白程序猿——逍遥。二、构成和表示方式关系运算符的作用是判断符号两边大小的关系C语言中的关系运算符主要有六个,如下表所示运算符名称示例......
  • 运算符
    title:运算符top:falsecover:falsetoc:truemathjax:truedate:2023-03-1415:43:06password:summary:tags:categories:&与运算两位同时为“1”,结果才为“1”,否则为0按位或运算符(|)运算位有一个为1结果为1异或运算符(^)运算位数字不相同(异)结果为1否则为......
  • Codeforces Round 717 (Div. 2) B. AGAGA XOOORRR(位运算)
    https://codeforces.com/contest/1516/problem/B题目大意:给定长度为n的数组a,问我们能不能一直选择两个相邻的元素进行异或后,删除这两个值,把异或值留下来,最后剩下>=2个数字,它们都是相同的?可以做到输出YES,不能的话输出NO。input23022423110outputYESNO题......
  • 逍遥自在学C语言 | 算数运算符
    前言一、人物简介第一位闪亮登场,有请今后会一直教我们C语言的老师——自在。第二位上场的是和我们一起学习的小白程序猿——逍遥。二、算数运算符简介C语言的算数运算符,是用来完成基本的算术运算的符号。按操作数个数可分为一元运算符(含一个操作数)和二元运算符......
  • 3-运算符
    1.运算符和表达式运算符:​ 就是对常量或者变量进行操作的符号。​ 比如:+-*/表达式:​ 用运算符把常量或者变量连接起来的,符合Java语法的式子就是表达式。​ 比如:a+b这个整体就是表达式。​ 而其中+是算术运算符的一种,所以这个表达式也称之为算术表达式。2.算术运......
  • C语言逆向——指针
    指针类型在C语言里面指针是一种数据类型,是给编译看的,也就是说指针与int、char、数组、结构体是平级的,都是一个类型。带"*"号的变量我们称之为指针类型,例如:char*x;short*y;int*a;float*b;...任何类型都可以带这个符号,格式就是:类型*名称;星号可以是多个。指针变量......
  • C语言逆向——预处理之宏定义、条件编译与文件包含
    预处理之宏定义、条件编译与文件包含预处理一般是指在程序源代码被转换为二进制代码之前,由预处理器对程序源代码文本进行处理,处理后的结果再由编译器进一步编译。预处理功能主要包括宏定义、文件包含、条件编译三部分。宏定义简单的宏:#define标识符字符序列#defineFALS......
  • Java-Day-3(运算符 + 标识符 + 键盘输入)
    Java-Day-3运算符算术运算符关系运算符[比较运算符]逻辑运算符赋值运算符三元运算符位运算符[需要二进制基础]算术运算符+、-、*、/System.out.println(10.0/4);//2.5doubled=10/4;//2.0//数学公式有时不能硬搬,例如:摄氏温度=5/9*(华氏温......