• 逆向-beginners之循环while


    #include <stdio.h>

    int my_strlen(const char * str)
    {
        const char *eos = str;

        while (*eos++);

        return (eos - str - 1);
    }

    int main()
    {
        return my_strlen("xiaozhi");
    }

    #if 0

    mov eax, dword ptr _str$[ebp]    ; 将指针指向字符串
    mov dword ptr _eos[ebp], eax    ; 指向局部变量eos
    mov ecx, dword ptr _eos$[ebp]    ; ECX=eos

    movsx edx, byte ptr [ecx]        
    mov eax, dword ptr eos$[ebp]    ; eax = eos
    add eax, 1                        ; eax++
    mov dword ptr _eos$[ebp], eax    ; eax 还原为 eos
    test edx, edx                    ; edx == 0 ?


    movsx , mov with sign-extend。在把小空间数据转换为大空间数据时,存在填充高位数据的问题。如将原始数据的8位数据填写充EDX的低8位:原始数据是负数,该指令将使用1填充第8到第31位(高24),否则使用0填充高24位。

    /* GCC */

    not ecx

    not对操作数的所有位(bit)都进行非运算。和xor ecx, 0xffffffff等价。 not ecx 的结果与某数相加,相当于某数减去ECX和1。

    在程度开始的时候,ECX保存了字符串首个字符的地址(指针),EAX存储的是终止符的地址。对ECX求非,再与EAX相加,就是在计算EAX-ECX-1的值。这种运算可以得到正确的字符串长度

    #endif

    #if 0
    /*
     * intel
     */
    0000000000001129 :
        1129:    f3 0f 1e fa              endbr64
        112d:    55                       push   %rbp
        112e:    48 89 e5                 mov    %rsp,%rbp
        1131:    48 89 7d e8              mov    %rdi,-0x18(%rbp)
        1135:    48 8b 45 e8              mov    -0x18(%rbp),%rax
        1139:    48 89 45 f8              mov    %rax,-0x8(%rbp)
        113d:    90                       nop
        113e:    48 8b 45 f8              mov    -0x8(%rbp),%rax
        1142:    48 8d 50 01              lea    0x1(%rax),%rdx
        1146:    48 89 55 f8              mov    %rdx,-0x8(%rbp)
        114a:    0f b6 00                 movzbl (%rax),%eax
        114d:    84 c0                    test   %al,%al
        114f:    75 ed                    jne    113e
        1151:    48 8b 45 f8              mov    -0x8(%rbp),%rax
        1155:    48 2b 45 e8              sub    -0x18(%rbp),%rax
        1159:    83 e8 01                 sub    $0x1,%eax
        115c:    5d                       pop    %rbp
        115d:    c3                       retq   

    000000000000115e

    :
        115e:    f3 0f 1e fa              endbr64
        1162:    55                       push   %rbp
        1163:    48 89 e5                 mov    %rsp,%rbp
        1166:    48 8d 3d 97 0e 00 00     lea    0xe97(%rip),%rdi        # 2004 <_IO_stdin_used+0x4>
        116d:    e8 b7 ff ff ff           callq  1129
        1172:    5d                       pop    %rbp
        1173:    c3                       retq   
        1174:    66 2e 0f 1f 84 00 00     nopw   %cs:0x0(%rax,%rax,1)
        117b:    00 00 00
        117e:    66 90                    xchg   %ax,%ax

    /*
     * arm
     */
    000000000040051c :
      40051c:    d10083ff     sub    sp, sp, #0x20
      400520:    f90007e0     str    x0, [sp, #8]
      400524:    f94007e0     ldr    x0, [sp, #8]
      400528:    f9000fe0     str    x0, [sp, #24]
      40052c:    d503201f     nop
      400530:    f9400fe0     ldr    x0, [sp, #24]
      400534:    91000401     add    x1, x0, #0x1
      400538:    f9000fe1     str    x1, [sp, #24]
      40053c:    39400000     ldrb    w0, [x0]
      400540:    7100001f     cmp    w0, #0x0
      400544:    54ffff61     b.ne    400530   // b.any
      400548:    f9400fe1     ldr    x1, [sp, #24]
      40054c:    f94007e0     ldr    x0, [sp, #8]
      400550:    cb000020     sub    x0, x1, x0
      400554:    51000400     sub    w0, w0, #0x1
      400558:    910083ff     add    sp, sp, #0x20
      40055c:    d65f03c0     ret

    0000000000400560

    :
      400560:    a9bf7bfd     stp    x29, x30, [sp, #-16]!
      400564:    910003fd     mov    x29, sp
      400568:    90000000     adrp    x0, 400000 <_init-0x3b0>
      40056c:    9118c000     add    x0, x0, #0x630
      400570:    97ffffeb     bl    40051c
      400574:    a8c17bfd     ldp    x29, x30, [sp], #16
      400578:    d65f03c0     ret
      40057c:    00000000     .inst    0x00000000 ; undefined


    #endif

  • 相关阅读:
    TCP协议UDP协议和HTTP协议
    DAO 的发展状态
    ClickHouse删除数据之delete问题详解
    LeetCode 6138. 最长理想子序列 动态规划
    实验四:健康打卡
    43%非常看好TypeScript…解读“2022前端开发者现状报告”
    FlinkCDC基础篇章1-安装使用
    从零开始的python生活02
    Excel VLOOKUP实用教程之 10 在使用 VLOOKUP 函数时处理错误?(教程含数据excel)
    shein测试开发会问些啥?
  • 原文地址:https://blog.csdn.net/xiaozhiwise/article/details/132993214