> ## Content Index
> Fetch the complete content index at: https://blog.hacking.pub/llms.txt
> Use this file to discover other available public pages before exploring further.

# ollydbg 试手　问题：i = i++
- URL: https://blog.hacking.pub/2017/02/16/ollydbg-shi-shou-wen-ti-i-i/
- Published: 2017-02-16T18:31:53.000Z
- Updated: 2017-02-16T18:31:53.000Z
- Author: chainhelen
- Tags: ollydbg, c语言, ida pro, 逆向工程, 汇编

#### 问题

很久以前准备写的一篇blog，当时只写了题目，调试用ollydbg搞的，最近才想起来要填坑  
大概是问，如下c系语言

```
int i = 0;
i = i++;

```

那么最终 i 的值是多少

#### 调试环境

本来应该是ollydbg，但是现在电脑是64位，还是用ida pro 1.6 64位  
codeblocks 16.01  
gcc version 4.9.2  
windows10

main.cpp

```
#include <stdio.h>
int main() {
    int i = 0;
    i = i++;
    //为什么要加hello world，纯粹只是为了让调试的时候方便点
    printf("hello world   %d\n",i);
    return 0;
}

```

#### 调试

利用ide编译生成，在bin/Debug里面，会有一个main.exe，把该文件直接拖入ida pro里面  
如下图所示  
![i=i++.1.png](https://blog.hacking.pub/qiniu/ollydbg%20%E8%AF%95%E6%89%8B%E3%80%80%E9%97%AE%E9%A2%98%EF%BC%9Ai%20%3D%20i%2B%2B/i%3Di%2B%2B.1.png)

在打开的界面，鼠标放在任意一行按下F2（下断点）下个断点，接着按下F9（执行）运行，程序就会断在刚才断点之处  
![i=i++.2.png](https://blog.hacking.pub/qiniu/ollydbg%20%E8%AF%95%E6%89%8B%E3%80%80%E9%97%AE%E9%A2%98%EF%BC%9Ai%20%3D%20i%2B%2B/i%3Di%2B%2B.2.png)

接着不停的按下F8（单步跳过），直到看到下图\_main函数  
![i=i++.3.png](https://blog.hacking.pub/qiniu/ollydbg%20%E8%AF%95%E6%89%8B%E3%80%80%E9%97%AE%E9%A2%98%EF%BC%9Ai%20%3D%20i%2B%2B/i%3Di%2B%2B.3.png)

尝试按下F7（单步进入）

![i=i++.4.png](https://blog.hacking.pub/qiniu/ollydbg%20%E8%AF%95%E6%89%8B%E3%80%80%E9%97%AE%E9%A2%98%EF%BC%9Ai%20%3D%20i%2B%2B/i%3Di%2B%2B.4.png)

此时

```
.text:0040134E mov     dword ptr [esp+1Ch], 0
.text:00401356 mov     eax, [esp+1Ch]
.text:0040135A lea     edx, [eax+1]
.text:0040135D mov     [esp+1Ch], edx
.text:00401361 mov     [esp+1Ch], eax
.text:00401365 mov     eax, [esp+1Ch]
.text:00401369 mov     [esp+4], eax
.text:0040136D mov     dword ptr [esp], offset aHelloWorldD ; "hello world%d\n"
.text:00401374 call    _printf
.text:00401379 mov     eax, 0

```

dword ptr \[esp+1Ch\], 0 理解为int i的地址是在 \[esp + 1Ch\]处，被赋值为0  
mov eax, \[esp+1Ch\]， 就是说暂时把 i 的值赋值一份给eax  
lea edx, \[eax + 1\]，可以理解为 i++ 赋值给了 edx  
mov \[esp+1Ch\], edx，可以理解为 i = i++中等号的作用，此时 i 的值为1  
mov \[esp+1Ch\]，eax，这样过后 i 又被赋值成了 0  
所以后面打印出来的 i 值是 0

#### 参考

> [IDA Pro使用技巧及大杂烩](http://blog.csdn.net/wang010366/article/details/52505345?ref=blog.hacking.pub)