逆向-还原代码之取余数 (Arm 64)

 

// code

#include <stdio.h>

void i_c_c()
{
    int num = 1234;
    int bit = 0;
    
    bit = num % 1000;
    printf("bit = %d\n", bit);
}

int main()
{
    i_c_c();

    return 0;
}

// asm

#include <stdio.h>

void i_c_c()
{
  /*4005fc:    a9be7bfd     stp    x29, x30, [sp, #-32]!
  400600:    910003fd     mov    x29, sp
  400604:    52809a40     mov    w0, #0x4d2                     // #1234
  400608:    b9001fa0     str    w0, [x29, #28]*/
    int a = 1234;

  /*40060c:    b9001bbf     str    wzr, [x29, #24]*/
    int b = 0;

  /*400610:    b9401fa0     ldr    w0, [x29, #28]                // w0 = 1234
  400614:    5289ba61     mov    w1, #0x4dd3                    // #19923
  400618:    72a20c41     movk    w1, #0x1062, lsl #16    // w1 = 0x10624dd3
  40061c:    9b217c01     smull    x1, w0, w1                // x1 = 1234*274877907 = 339199337238 = 0x4E F9DB 2316
  400620:    d360fc21     lsr    x1, x1, #32                    // x1 = 0x4E
  400624:    13067c22     asr    w2, w1, #6                    // w2 = (0x4E>>6) = 1    (2^38)/274877907 = 999.9999 = 1000
  400628:    131f7c01     asr    w1, w0, #31                    // w1 =    (1234>>31) = 0    
  40062c:    4b010042     sub    w2, w2, w1                    // w2 = w2-w1 = 1
  400630:    52807d01     mov    w1, #0x3e8                     // #1000
  400634:    1b017c41     mul    w1, w2, w1                    // w1 = 1 * 1000
  400638:    4b010000     sub    w0, w0, w1                    // w0 = 1234 - 1000
  40063c:    b9001ba0     str    w0, [x29, #24]*/
    b = a % 1000;

  /*400640:    90000000     adrp    x0, 400000 <_init-0x480>
  400644:    911ca000     add    x0, x0, #0x728
  400648:    b9401ba1     ldr    w1, [x29, #24]
  40064c:    97ffffa9     bl    4004f0 <printf@plt>*/
    printf("%d\n", b);

  /*400650:    d503201f     nop
  400654:    a8c27bfd     ldp    x29, x30, [sp], #32
  400658:    d65f03c0     ret*/
}

int main()
{
  /*40065c:    a9bf7bfd     stp    x29, x30, [sp, #-16]!
  400660:    910003fd     mov    x29, sp
  400664:    97ffffe6     bl    4005fc <i_c_c>*/
    i_c_c();

  /*400668:    52800000     mov    w0, #0x0                       // #0
  40066c:    a8c17bfd     ldp    x29, x30, [sp], #16
  400670:    d65f03c0     ret
  400674:    00000000     .inst    0x00000000 ; undefined*/
  return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值