• 逆向-还原代码之split (Arm 64)


    #include
    #include <stdlib.h>
    #include


    void a_1()
    {
      /*4005fc:    a9bd7bfd     stp    x29, x30, [sp, #-48]!
      400600:    910003fd     mov    x29, sp  
      400604:    d2800020     mov    x0, #0x1                       // #1
      400608:    f9000fa0     str    x0, [x29, #24]*/
        long j = 1;

      /*40060c:    52800040     mov    w0, #0x2                       // #2
      400610:    b90017a0     str    w0, [x29, #20]*/
        int i = 2;

      /*400614:    b9002fbf     str    wzr, [x29, #44]    // [x29+44] = 0
      400618:    b9402fa0     ldr    w0, [x29, #44]    // w0 = 0
      40061c:    b9002ba0     str    w0, [x29, #40]    // [x29+40] = 0
      400620:    b9402ba0     ldr    w0, [x29, #40]    // w0 = 0
      400624:    b90027a0     str    w0, [x29, #36]    // [x29+36] = 0
      400628:    b94027a0     ldr    w0, [x29, #36]    // w0 = 0
      40062c:    b90023a0     str    w0, [x29, #32]    // [x29+32] = 0*/
        int a[4];
        a[0] = a[1] = a[2] = a[3] = 0;


      /*400630:    f9400fa1     ldr    x1, [x29, #24]    // x1 = [x29+24] = 1
      400634:    90000000     adrp    x0, 400000 <_init-0x480>
      400638:    91266000     add    x0, x0, #0x998
      40063c:    97ffffad     bl    4004f0 */
        printf("%ld\n", j);

      /*400640:    910063a1     add    x1, x29, #0x18    
      400644:    90000000     adrp    x0, 400000 <_init-0x480>
      400648:    91266000     add    x0, x0, #0x998
      40064c:    97ffffa9     bl    4004f0 */
        printf("%p\n", &j);

      /*400650:    f9400fa1     ldr    x1, [x29, #24]    // x1 = j = 1
      400654:    f9400fa0     ldr    x0, [x29, #24]    // x0 = j = 1
      400658:    91001002     add    x2, x0, #0x4    // x2 = 1 + 0x4 = 5
      40065c:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 1
      400660:    91002003     add    x3, x0, #0x8    // x3 = 1+8 = 9
      400664:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 1
      400668:    91003004     add    x4, x0, #0xc    // x4 = 14
      40066c:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 1
      400670:    91004005     add    x5, x0, #0x10    // x5 = 1 + 0x10 = 17
      400674:    f9400fa0     ldr    x0, [x29, #24]    // [x29+24] = 1
      400678:    91005006     add    x6, x0, #0x14    // x6 = 1+0x14 = 21
      40067c:    90000000     adrp    x0, 400000 <_init-0x480>
      400680:    91268000     add    x0, x0, #0x9a0
      400684:    97ffff9b     bl    4004f0 */
        printf("%ld %ld %ld %ld %ld %ld\n", j, j+0x4, j+8, j+12, j+16, j+20);

      /*400688:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 1
      40068c:    b90023a0     str    w0, [x29, #32]    // [x29+32] = 1*/
        a[0] = j;

      /*400690:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 1
      400694:    91001000     add    x0, x0, #0x4    // x0 = 1+0x4 = 5
      400698:    b90027a0     str    w0, [x29, #36]    // [x29+36] = 5*/
        a[1] = j + 0x4;

      /*40069c:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 1
      4006a0:    91002000     add    x0, x0, #0x8    // x0 = 1 + 8
      4006a4:    b9002ba0     str    w0, [x29, #40]    // [x29+40] = 9*/
        a[2] = j + 0x8;
     
      /*4006a8:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 1
      4006ac:    91003000     add    x0, x0, #0xc    // x0 = 1 + 0xc
      4006b0:    b9002fa0     str    w0, [x29, #44]    // [x29+44] = 0xd*/
        a[3] = j + 0xc;
     
      /*4006b4:    90000000     adrp    x0, 400000 <_init-0x480>
      4006b8:    91270000     add    x0, x0, #0x9c0
      4006bc:    b9402fa4     ldr    w4, [x29, #44]    // w2 = 0xd
      4006c0:    b9402ba3     ldr    w3, [x29, #40]    // w3 = 9
      4006c4:    b94027a2     ldr    w2, [x29, #36]    // w2 = 5
      4006c8:    b94023a1     ldr    w1, [x29, #32]    // w1 = 1
      4006cc:    97ffff89     bl    4004f0 */
        printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);

      /*4006d0:    910053a0     add    x0, x29, #0x14    // x0 = x29+20
      4006d4:    f9000fa0     str    x0, [x29, #24]    // [x29+24] = x29+20 = &i */
        j = (long)&i;
      /*4006d8:    910053a1     add    x1, x29, #0x14    // x1 = x29+20
      4006dc:    90000000     adrp    x0, 400000 <_init-0x480>
      4006e0:    91274000     add    x0, x0, #0x9d0
      4006e4:    97ffff83     bl    4004f0 */
        printf("%lx\n", (long)&i);

      /*4006e8:    f9400fa1     ldr    x1, [x29, #24]    // x1 = &i
      4006ec:    90000000     adrp    x0, 400000 <_init-0x480>
      4006f0:    91266000     add    x0, x0, #0x998
      4006f4:    97ffff7f     bl    4004f0 */
        printf("%lx\n", j);

      /*4006f8:    f9400fa0     ldr    x0, [x29, #24]    // x0 = &i
      4006fc:    b9400001     ldr    w1, [x0]        // w1 = 2
      400700:    90000000     adrp    x0, 400000 <_init-0x480>
      400704:    91266000     add    x0, x0, #0x998
      400708:    97ffff7a     bl    4004f0 */
        printf("%d\n", *(int*)j);

      /*40070c:    d503201f     nop
      400710:    a8c37bfd     ldp    x29, x30, [sp], #48
      400714:    d65f03c0     ret*/
    }

    void a_0()
    {
      /*400718:    a9bd7bfd     stp    x29, x30, [sp, #-48]!
      40071c:    910003fd     mov    x29, sp
      400720:    f9000fbf     str    xzr, [x29, #24]
      400724:    b9002fbf     str    wzr, [x29, #44]*/
        long j = 0;
        int i = 0;

      /*400728:    b9402fa0     ldr    w0, [x29, #44]
      40072c:    b9002ba0     str    w0, [x29, #40]
      400730:    b9402ba0     ldr    w0, [x29, #40]
      400734:    b90027a0     str    w0, [x29, #36]
      400738:    b94027a0     ldr    w0, [x29, #36]
      40073c:    b90023a0     str    w0, [x29, #32]*/
        int a[3];
        a[0] = a[1] = a[2] = i;

      /*400740:    f9400fa1     ldr    x1, [x29, #24]
      400744:    90000000     adrp    x0, 400000 <_init-0x480>
      400748:    91266000     add    x0, x0, #0x998
      40074c:    97ffff69     bl    4004f0 */
        printf("%ld\n", j);

      /*400750:    910063a1     add    x1, x29, #0x18
      400754:    90000000     adrp    x0, 400000 <_init-0x480>
      400758:    91266000     add    x0, x0, #0x998
      40075c:    97ffff65     bl    4004f0 */
        printf("%ld\n", (long)&j);

      /*400760:    f9400fa1     ldr    x1, [x29, #24]    // x1 = 0
      400764:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 0
      400768:    91001002     add    x2, x0, #0x4    // x2 = 0+4
      40076c:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 0
      400770:    91002003     add    x3, x0, #0x8    // x3 = 0+8
      400774:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 0
      400778:    91003004     add    x4, x0, #0xc    // x4 = 0+c
      40077c:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 0
      400780:    91004005     add    x5, x0, #0x10    // x5 = 0+0x10
      400784:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 0
      400788:    91005006     add    x6, x0, #0x14    // x6 = 0+0x14
      40078c:    90000000     adrp    x0, 400000 <_init-0x480>
      400790:    91268000     add    x0, x0, #0x9a0
      400794:    97ffff57     bl    4004f0 */
        printf("%ld %ld %ld %ld %ld %ld\n", j, j+4, j+8, j+12, j+16, j+20);

      /*400798:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 0
      40079c:    b90023a0     str    w0, [x29, #32]    // [x29+32] = 0*/
        a[0] = j;
      /*4007a0:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 0
      4007a4:    91001000     add    x0, x0, #0x4    // x0 = 0+4
      4007a8:    b90027a0     str    w0, [x29, #36]    // [x29+36] = 4*/
        a[1] = j+4;

      /*4007ac:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 0
      4007b0:    91002000     add    x0, x0, #0x8    // x0 = 0+8
      4007b4:    b9002ba0     str    w0, [x29, #40]    // [x29+40] = 8*/
        a[2] = j+8;

      /*4007b8:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 0
      4007bc:    91003000     add    x0, x0, #0xc    // x0 = 0+c
      4007c0:    b9002fa0     str    w0, [x29, #44]    // [x29+44] = 12*/
        i = j+12;

      /*4007c4:    90000000     adrp    x0, 400000 <_init-0x480>
      4007c8:    91270000     add    x0, x0, #0x9c0
      4007cc:    b9402fa4     ldr    w4, [x29, #44]
      4007d0:    b9402ba3     ldr    w3, [x29, #40]
      4007d4:    b94027a2     ldr    w2, [x29, #36]
      4007d8:    b94023a1     ldr    w1, [x29, #32]
      4007dc:    97ffff45     bl    4004f0 */
        printf("%d %d %d %d\n", a[0], a[1], a[2], i);
     
      /*4007e0:    d503201f     nop
      4007e4:    a8c37bfd     ldp    x29, x30, [sp], #48
      4007e8:    d65f03c0     ret*/
    }

    void a_3()
    {
      /*4007ec:    a9bd7bfd     stp    x29, x30, [sp, #-48]!
      4007f0:    910003fd     mov    x29, sp
      4007f4:    d2800060     mov    x0, #0x3                       // #3
      4007f8:    f9000fa0     str    x0, [x29, #24]
      4007fc:    b9002fbf     str    wzr, [x29, #44] */
        long j = 3;
        int i = 0;

      /*400800:    b9402fa0     ldr    w0, [x29, #44]
      400804:    b9002ba0     str    w0, [x29, #40]
      400808:    b9402ba0     ldr    w0, [x29, #40]
      40080c:    b90027a0     str    w0, [x29, #36]
      400810:    b94027a0     ldr    w0, [x29, #36]
      400814:    b90023a0     str    w0, [x29, #32] */
        int a[3];
        a[0] = a[1] = a[2] = i;

      /*400818:    f9400fa1     ldr    x1, [x29, #24]
      40081c:    90000000     adrp    x0, 400000 <_init-0x480>
      400820:    91266000     add    x0, x0, #0x998
      400824:    97ffff33     bl    4004f0 */
        printf("%ld\n", j);

      /*400828:    910063a1     add    x1, x29, #0x18
      40082c:    90000000     adrp    x0, 400000 <_init-0x480>
      400830:    91266000     add    x0, x0, #0x998
      400834:    97ffff2f     bl    4004f0 */
        printf("%ld\n", (long)&j);

      /*400838:    f9400fa1     ldr    x1, [x29, #24]    // x1 = j = 3
      40083c:    f9400fa0     ldr    x0, [x29, #24]    // x0 = j = 3
      400840:    91001002     add    x2, x0, #0x4    // x2 = 3+0x4
      400844:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 3
      400848:    91002003     add    x3, x0, #0x8    // x3 = 3+8
      40084c:    f9400fa0     ldr    x0, [x29, #24]    // x0
      400850:    91003004     add    x4, x0, #0xc    // x4 = 3+c
      400854:    f9400fa0     ldr    x0, [x29, #24]
      400858:    91004005     add    x5, x0, #0x10    // x5 = 3+0x10
      40085c:    f9400fa0     ldr    x0, [x29, #24]
      400860:    91005006     add    x6, x0, #0x14    // x6 = 3+0x14
      400864:    90000000     adrp    x0, 400000 <_init-0x480>
      400868:    91268000     add    x0, x0, #0x9a0
      40086c:    97ffff21     bl    4004f0 */
        printf("%ld %ld %ld %ld %ld %ld\n", j, j+4, j+8, j+12, j+16, j+20);

      /*400870:    f9400fa0     ldr    x0, [x29, #24]    // x0 = j = 3
      400874:    b90023a0     str    w0, [x29, #32]    // [x29+32] = 3 */
        a[0] = j;

      /*400878:    f9400fa0     ldr    x0, [x29, #24]    // x0 = 3
      40087c:    91001000     add    x0, x0, #0x4    // x0 = 3+4
      400880:    b90027a0     str    w0, [x29, #36]    // [x29+36] = 3+4 */
        a[1] = j + 4;

      /*400884:    f9400fa0     ldr    x0, [x29, #24]
      400888:    91002000     add    x0, x0, #0x8
      40088c:    b9002ba0     str    w0, [x29, #40]    */
        a[2] = j + 8;

      /*400890:    f9400fa0     ldr    x0, [x29, #24]
      400894:    91003000     add    x0, x0, #0xc
      400898:    b9002fa0     str    w0, [x29, #44] */
        i = j + 0xc;

      /*40089c:    90000000     adrp    x0, 400000 <_init-0x480>
      4008a0:    91270000     add    x0, x0, #0x9c0
      4008a4:    b9402fa4     ldr    w4, [x29, #44]
      4008a8:    b9402ba3     ldr    w3, [x29, #40]
      4008ac:    b94027a2     ldr    w2, [x29, #36]
      4008b0:    b94023a1     ldr    w1, [x29, #32]
      4008b4:    97ffff0f     bl    4004f0 */
        printf("%d %d %d %d\n", a[0], a[1], a[2], i);

      /*4008b8:    d503201f     nop
      4008bc:    a8c37bfd     ldp    x29, x30, [sp], #48
      4008c0:    d65f03c0     ret*/

    }

    int main()
    {
      /*4008c4:    a9bf7bfd     stp    x29, x30, [sp, #-16]!
      4008c8:    910003fd     mov    x29, sp*/
      //4008cc:    97ffff4c     bl    4005fc
        a_1();

      //4008d0:    97ffff92     bl    400718
        a_0();

      //4008d4:    97ffffc6     bl    4007ec
        a_3();
     
      /*4008d8:    d503201f     nop
      4008dc:    a8c17bfd     ldp    x29, x30, [sp], #16
      4008e0:    d65f03c0     ret
      4008e4:    00000000     .inst    0x00000000 ; undefined*/

        return 0;    
    }


    // code
    void a_1()
    {
        int *a = 1;
        int byte1, byte2, byte3, byte4;
        int b = 2;

        byte1 = byte2 = byte3 = byte4 = 0;

        printf("a=%x\n", a);    // 1
        printf("a=%x\n", &a);    // b7d24708

        printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]); // 0x1 0x5 0x9 0xd 0x11 0x15
        //printf("%x %x %x %x\n", a[0], a[1], a[2], a[3]);     // Segmentation fault (core dumped)

        byte1 = (char *)&a[0];
        byte2 = (char *)&a[1];
        byte3 = (char *)&a[2];
        byte4 = (char *)&a[3];

        printf("%x %x %x %x\n", byte1, byte2, byte3, byte4); // 1 5 9 d

        a = &b;
        printf("b=%x\n", &b);    // b7d246f4
        printf("a=%x\n", a);    // b7d246f4
        printf("a=%x\n", *a);    // 2
    }

    void a_0()
    {
        int *a = 0;
        int byte1, byte2, byte3, byte4;

        byte1 = byte2 = byte3 = byte4 = 0;

        printf("a=%x\n", a);    // 0    指向地址0
        //printf("a=%d\n", *a);    // Segmentation fault (core dumped) 取地址0上的数据,报错
        printf("a=%x\n", &a);    // c03f1498

        printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]); // 0x0 0x4 0x8 0xc 0x10 0x14
        //printf("%x %x %x %x\n", a[0], a[1], a[2], a[3]);     // Segmentation fault (core dumped)

        byte1 = (char *)&a[0];
        byte2 = (char *)&a[1];
        byte3 = (char *)&a[2];
        byte4 = (char *)&a[3];

        printf("%x %x %x %x\n", byte1, byte2, byte3, byte4); // 0 4 8 c
    }

    void a_3()
    {
        int *a = 3;
        int byte1, byte2, byte3, byte4;

        byte1 = byte2 = byte3 = byte4 = 0;

        printf("a=%x\n", a);    // 3
        printf("a=%x\n", &a);    // ce340a48

        printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]); // 0x3 0x7 0xb 0xf 0x13 0x17
        //printf("%x %x %x %x\n", a[0], a[1], a[2], a[3]);     // Segmentation fault (core dumped)

        byte1 = (char *)&a[0];
        byte2 = (char *)&a[1];
        byte3 = (char *)&a[2];
        byte4 = (char *)&a[3];

        printf("%x %x %x %x\n", byte1, byte2, byte3, byte4); // 3 7 b f
    }

    void main()
    {
        a_1();
        a_0();
        a_3();
    }

  • 相关阅读:
    Python基础入门例程13-NP13 格式化输出(三)
    AndroidT(13) -- C plus plus 语言格式的LOG输出(二)
    sh多种赋值方式和连续输出值
    Mysql的日志系统
    Gromacs分析处理-模拟前后蛋白结构差异对比图的制作
    训练自己的ChatGPT 语言模型(一).md
    计算机网络复习-第六章应用层
    C语言--typedef的使用
    软件开发和测试
    SpringAOP是什么?为什么要有SpringAOP?
  • 原文地址:https://blog.csdn.net/xiaozhiwise/article/details/128112486