• 逆向-beginners之函数指针


    #include
    #include

    int comp(const void * _a, const void * _b)
    {
        const int *a = (const int *)_a;
        const int *b = (const int *)_b;

        if (*a == *b)
                return 0;
        else
                if (*a < *b)
                        return -1;
                else
                        return 1;
    }

    int main(int argc, char * argv[])
    {
        int numbers[10] = {1892, 45, 200, -98, 4087, 5, -12345, 1087, 88, -100000};
        int i;

        /* sort the array */
        qsort(numbers, 10, sizeof(int), comp);        // qsort函数内循环
        for (i = 0; i < 9; i++)
                printf("Number = %d\n", numbers[i]);

        return 0;
    }
    /*
        Number = -100000
        Number = -12345
        Number = -98
        Number = 5
        Number = 45
        Number = 88
        Number = 200
        Number = 1087
        Number = 1892
    */

    #if 0
    /*
     * intel
     */
      0x555555555189
    0000000000001189 :
        1189:    f3 0f 1e fa              endbr64                    // rsp=0x7fffffffde78
        118d:    55                       push   %rbp                // 0x7fffffffde70
        118e:    48 89 e5                 mov    %rsp,%rbp        // rsp=rbp=0x7fffffffde70
        1191:    48 89 7d e8              mov    %rdi,-0x18(%rbp)    // 0x7fffffffde58: 0x00007fffffffe0f0
        1195:    48 89 75 e0              mov    %rsi,-0x20(%rbp)    // 0x7fffffffde50: 0x00007fffffffe0f4
        1199:    48 8b 45 e8              mov    -0x18(%rbp),%rax    // rax=0x7fffffffe0f0
        119d:    48 89 45 f0              mov    %rax,-0x10(%rbp)    // 0x7fffffffde60: 0x00007fffffffe0f0
        11a1:    48 8b 45 e0              mov    -0x20(%rbp),%rax    // rax=0x7fffffffe0f4
        11a5:    48 89 45 f8              mov    %rax,-0x8(%rbp)    // 0x7fffffffde68: 0x00007fffffffe0f4
        11a9:    48 8b 45 f0              mov    -0x10(%rbp),%rax    // 0x7fffffffe0f0
        11ad:    8b 10                    mov    (%rax),%edx        // 0x7fffffffe0f0: 0x0000002d00000764    edx=0x764
        11af:    48 8b 45 f8              mov    -0x8(%rbp),%rax    // rax=0x7fffffffe0f4
        11b3:    8b 00                    mov    (%rax),%eax        // 0x7fffffffe0f4: 0x000000c80000002d    eax=0x2d
        11b5:    39 c2                    cmp    %eax,%edx
        11b7:    75 07                    jne    11c0
        11b9:    b8 00 00 00 00           mov    $0x0,%eax
        11be:    eb 1c                    jmp    11dc
        11c0:    48 8b 45 f0              mov    -0x10(%rbp),%rax    // 0x7fffffffe0f0
        11c4:    8b 10                    mov    (%rax),%edx        // 0x7fffffffe0f0: 0x0000002d00000764    edx=0x764
        11c6:    48 8b 45 f8              mov    -0x8(%rbp),%rax    // 0x7fffffffe0f4
        11ca:    8b 00                    mov    (%rax),%eax        // 0x7fffffffe0f4: 0x000000c80000002d    eax=0x2d
        11cc:    39 c2                    cmp    %eax,%edx
        11ce:    7d 07                    jge    11d7
        11d0:    b8 ff ff ff ff           mov    $0xffffffff,%eax
        11d5:    eb 05                    jmp    11dc
        11d7:    b8 01 00 00 00           mov    $0x1,%eax        // eax=1
        11dc:    5d                       pop    %rbp
        11dd:    c3                       retq   

    00000000000011de

    :
        11de:    f3 0f 1e fa              endbr64                    // rsp=0x7fffffffe128
        11e2:    55                       push   %rbp                // rsp=0x7fffffffe120
        11e3:    48 89 e5                 mov    %rsp,%rbp        // 0x7fffffffe120
        11e6:    48 83 ec 50              sub    $0x50,%rsp        // 0x7fffffffe0d0
        11ea:    89 7d bc                 mov    %edi,-0x44(%rbp)    // 0x00000001
        11ed:    48 89 75 b0              mov    %rsi,-0x50(%rbp)    // 0x7fffffffe0d0: 0x00007fffffffe218
        11f1:    64 48 8b 04 25 28 00     mov    %fs:0x28,%rax
        11f8:    00 00 
        11fa:    48 89 45 f8              mov    %rax,-0x8(%rbp)    // 0x7fffffffe118: 0xe62783cd21946100
        11fe:    31 c0                    xor    %eax,%eax
        1200:    c7 45 d0 64 07 00 00     movl   $0x764,-0x30(%rbp)    // 0x7fffffffe0f0: 0x00007fff00000764
        1207:    c7 45 d4 2d 00 00 00     movl   $0x2d,-0x2c(%rbp)    // 0x7fffffffe0f4: 0x555552b00000002d
        120e:    c7 45 d8 c8 00 00 00     movl   $0xc8,-0x28(%rbp)    // 0x7fffffffe0f8: 0x00005555000000c8
        1215:    c7 45 dc 9e ff ff ff     movl   $0xffffff9e,-0x24(%rbp)    // 0x7fffffffe0fc: 0x00000000ffffff9e
        121c:    c7 45 e0 f7 0f 00 00     movl   $0xff7,-0x20(%rbp)        // 0x7fffffffe100: 0x0000000000000ff7
        1223:    c7 45 e4 05 00 00 00     movl   $0x5,-0x1c(%rbp)            // 0x7fffffffe104: 0x555550a000000005
        122a:    c7 45 e8 c7 cf ff ff     movl   $0xffffcfc7,-0x18(%rbp)    // 0x7fffffffe108: 0x00005555ffffcfc7
        1231:    c7 45 ec 3f 04 00 00     movl   $0x43f,-0x14(%rbp)        // 0x7fffffffe10c: 0xffffe2100000043f
        1238:    c7 45 f0 58 00 00 00     movl   $0x58,-0x10(%rbp)        // 0x7fffffffe110: 0x00007fff00000058
        123f:    c7 45 f4 60 79 fe ff     movl   $0xfffe7960,-0xc(%rbp)    // 0x7fffffffe114: 0x21946100fffe7960
        1246:    48 8d 45 d0              lea    -0x30(%rbp),%rax            // 0x7fffffffe0f0: 0x0000002d00000764    rax=0x7fffffffe0f0
        124a:    48 8d 0d 38 ff ff ff     lea    -0xc8(%rip),%rcx        # 1189     rcx=0x555555555189
        1251:    ba 04 00 00 00           mov    $0x4,%edx        // edx=4
        1256:    be 0a 00 00 00           mov    $0xa,%esi            
        125b:    48 89 c7                 mov    %rax,%rdi        // rdi=0x7fffffffe0f0
        125e:    e8 0d fe ff ff           callq  1070     // 0x0000555555555189:comp

        1263:    c7 45 cc 00 00 00 00     movl   $0x0,-0x34(%rbp)
        126a:    eb 20                    jmp    128c
        126c:    8b 45 cc                 mov    -0x34(%rbp),%eax
        126f:    48 98                    cltq   
        1271:    8b 44 85 d0              mov    -0x30(%rbp,%rax,4),%eax
        1275:    89 c6                    mov    %eax,%esi
        1277:    48 8d 3d 86 0d 00 00     lea    0xd86(%rip),%rdi        # 2004 <_IO_stdin_used+0x4>
        127e:    b8 00 00 00 00           mov    $0x0,%eax
        1283:    e8 08 fe ff ff           callq  1090
        1288:    83 45 cc 01              addl   $0x1,-0x34(%rbp)
        128c:    83 7d cc 08              cmpl   $0x8,-0x34(%rbp)
        1290:    7e da                    jle    126c
        1292:    b8 00 00 00 00           mov    $0x0,%eax
        1297:    48 8b 55 f8              mov    -0x8(%rbp),%rdx
        129b:    64 48 33 14 25 28 00     xor    %fs:0x28,%rdx
        12a2:    00 00 
        12a4:    74 05                    je     12ab
        12a6:    e8 d5 fd ff ff           callq  1080 <__stack_chk_fail@plt>
        12ab:    c9                       leaveq 
        12ac:    c3                       retq   
        12ad:    0f 1f 00                 nopl   (%rax)

    /*
     * arm
     */
    00000000004005ac :
      4005ac:    d10083ff     sub    sp, sp, #0x20
      4005b0:    f90007e0     str    x0, [sp, #8]
      4005b4:    f90003e1     str    x1, [sp]
      4005b8:    f94007e0     ldr    x0, [sp, #8]
      4005bc:    f9000fe0     str    x0, [sp, #24]
      4005c0:    f94003e0     ldr    x0, [sp]
      4005c4:    f9000be0     str    x0, [sp, #16]
      4005c8:    f9400fe0     ldr    x0, [sp, #24]
      4005cc:    b9400001     ldr    w1, [x0]
      4005d0:    f9400be0     ldr    x0, [sp, #16]
      4005d4:    b9400000     ldr    w0, [x0]
      4005d8:    6b00003f     cmp    w1, w0
      4005dc:    54000061     b.ne    4005e8  // b.any
      4005e0:    52800000     mov    w0, #0x0                       // #0
      4005e4:    1400000a     b    40060c
      4005e8:    f9400fe0     ldr    x0, [sp, #24]
      4005ec:    b9400001     ldr    w1, [x0]
      4005f0:    f9400be0     ldr    x0, [sp, #16]
      4005f4:    b9400000     ldr    w0, [x0]
      4005f8:    6b00003f     cmp    w1, w0
      4005fc:    5400006a     b.ge    400608  // b.tcont
      400600:    12800000     mov    w0, #0xffffffff                // #-1
      400604:    14000002     b    40060c
      400608:    52800020     mov    w0, #0x1                       // #1
      40060c:    910083ff     add    sp, sp, #0x20
      400610:    d65f03c0     ret

    0000000000400614

    :
      400614:    a9bb7bfd     stp    x29, x30, [sp, #-80]!
      400618:    910003fd     mov    x29, sp
      40061c:    b9001fa0     str    w0, [x29, #28]
      400620:    f9000ba1     str    x1, [x29, #16]
      400624:    90000000     adrp    x0, 400000 <_init-0x428>
      400628:    911dc001     add    x1, x0, #0x770
      40062c:    910083a0     add    x0, x29, #0x20
      400630:    a9400c22     ldp    x2, x3, [x1]
      400634:    a9000c02     stp    x2, x3, [x0]
      400638:    a9410c22     ldp    x2, x3, [x1, #16]
      40063c:    a9010c02     stp    x2, x3, [x0, #16]
      400640:    f9401021     ldr    x1, [x1, #32]
      400644:    f9001001     str    x1, [x0, #32]
      400648:    90000000     adrp    x0, 400000 <_init-0x428>
      40064c:    9116b001     add    x1, x0, #0x5ac
      400650:    910083a0     add    x0, x29, #0x20
      400654:    aa0103e3     mov    x3, x1
      400658:    d2800082     mov    x2, #0x4                       // #4
      40065c:    d2800141     mov    x1, #0xa                       // #10
      400660:    97ffff80     bl    400460
      400664:    b9004fbf     str    wzr, [x29, #76]
      400668:    1400000b     b    400694
      40066c:    b9804fa0     ldrsw    x0, [x29, #76]
      400670:    d37ef400     lsl    x0, x0, #2
      400674:    910083a1     add    x1, x29, #0x20
      400678:    b8606821     ldr    w1, [x1, x0]
      40067c:    90000000     adrp    x0, 400000 <_init-0x428>
      400680:    911d8000     add    x0, x0, #0x760
      400684:    97ffff87     bl    4004a0
      400688:    b9404fa0     ldr    w0, [x29, #76]
      40068c:    11000400     add    w0, w0, #0x1
      400690:    b9004fa0     str    w0, [x29, #76]
      400694:    b9404fa0     ldr    w0, [x29, #76]
      400698:    7100201f     cmp    w0, #0x8
      40069c:    54fffe8d     b.le    40066c
      4006a0:    52800000     mov    w0, #0x0                       // #0
      4006a4:    a8c57bfd     ldp    x29, x30, [sp], #80
      4006a8:    d65f03c0     ret
      4006ac:    00000000     .inst    0x00000000 ; undefined


    #endif

  • 相关阅读:
    数据结构与算法之树、森林与二叉树的转换(手绘)
    第六十四章 CSP的常见问题 - 发送给浏览器的HTTP头信息是什么
    Web APIs Web APIs第六天
    【Simulia】 Lsight多学科仿真流程 | 达索系统百世慧®
    Java程序输入、输出、动态数组、列表、类型转换、字符串遍历
    DGIOT实战教程——虚拟ModbusRTU接入
    QModbus库使用,并作为ROS节点发布话题及程序CMakelist编写
    R 语言data.frame 中的另一行中减去一行
    时钟树综合(一)
    JavaWeb — JSTL标签库
  • 原文地址:https://blog.csdn.net/xiaozhiwise/article/details/133213142