Bootstrap

【IDA】逆向练习:for循环while循环

先看看下面这段返回点代码

int __cdecl main(int argc, const char **argv, const char **envp)
.text:00401000 _main           proc near               ; CODE XREF: start+AF↓p
.text:00401000
.text:00401000 argc            = dword ptr  4
.text:00401000 argv            = dword ptr  8
.text:00401000 envp            = dword ptr  0Ch
.text:00401000
.text:00401000                 mov     ecx, 0C0h
.text:00401005                 xor     eax, eax
.text:00401007
.text:00401007 loc_401007:                             ; CODE XREF: _main+D↓j
.text:00401007                 sub     ecx, eax
.text:00401009                 inc     eax
.text:0040100A                 cmp     eax, 0Ah
.text:0040100D                 jl      short loc_401007
.text:0040100F                 push    ecx
.text:00401010                 push    offset aNumD    ; "num = %d\n"
.text:00401015                 call    sub_401020
.text:0040101A                 add     esp, 8
.text:0040101D                 xor     eax, eax
.text:0040101F                 retn
.text:0040101F _main           endp

这段程序是一个循环,循环示意图如下图
在这里插入图片描述

运行上面代码
返回的结果是:
在这里插入图片描述

用IDA的F5功能
直接翻译出如下代码
在这里插入图片描述

下面我们运行下面的C代码 运行结果复合预期。

#include<Windows.h>
#include<stdio.h>

int main()
{
    int v3; // ecx
    int i; // eax

    v3 = 192;
    for (i = 0; i < 10; ++i)
        v3 -= i;
    printf("num = %d\n", v3);
    return 0;
}

运行结果
在这里插入图片描述

我们把上面for语句改为do while结构看下运行结果复合预期

#include<Windows.h>
#include<stdio.h>

int main()
{
    int v3 = 192; // ecx
    int i = 0; // eax
    
    do 
    {
        v3 -= i;
        i++;
    } while (i<10);


    printf("num = %d\n", v3);
    return 0;
}

在这里插入图片描述

;