C语言逆向——常量字符串的赋值copy分析

注意区别,hello 和 world两个字符串都是放在常量存储区的!

1
2
3
4
5
6
7
int main(int argc, char* argv[]) {
    // Fun(101);
    char* s = "hello";
    char arr[] = "world";
    printf("%s\n %s\n", s, arr);
    return 0;
}

  

但是,在给arr赋值的时候,从其汇编实现看,是copy 常量world的内容了过去。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
98:       char* s = "hello";
0040D8A8   mov         dword ptr [ebp-4],offset string "hello" (00422fc8)
99:       char arr[] = "world";
0040D8AF   mov         eax,[string "world" (00422fc0)]
0040D8B4   mov         dword ptr [ebp-0Ch],eax
0040D8B7   mov         cx,word ptr [string "world"+4 (00422fc4)]
0040D8BE   mov         word ptr [ebp-8],cx
100:      printf("%s\n %s\n", s, arr);
0040D8C2   lea         edx,[ebp-0Ch]
0040D8C5   push        edx
0040D8C6   mov         eax,dword ptr [ebp-4]
0040D8C9   push        eax
0040D8CA   push        offset string "%s\n %s\n" (00422fb8)
0040D8CF   call        printf (0040d710)

 

因为world占用2个字节,所以mov了两次,也就是先copy worl部分,再copy 最后d字符。  

1
2
3
4
0040D8AF   mov         eax,[string "world" (00422fc0)]
0040D8B4   mov         dword ptr [ebp-0Ch],eax
0040D8B7   mov         cx,word ptr [string "world"+4 (00422fc4)]
0040D8BE   mov         word ptr [ebp-8],cx

我们验证下,将字符串继续增加:

1
2
3
4
5
6
7
int main(int argc, char* argv[]) {
    // Fun(101);
    char* s = "hello";
    char arr[] = "world12345678";
    printf("%s\n %s\n", s, arr);
    return 0;
}

  

反汇编看看,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
98:       char* s = "hello";
0040D8A8   mov         dword ptr [ebp-4],offset string "hello" (00422fc8)
99:       char arr[] = "world12345678";
0040D8AF   mov         eax,[string "world12345678" (00422fd0)]
0040D8B4   mov         dword ptr [ebp-14h],eax
0040D8B7   mov         ecx,dword ptr [string "world12345678"+4 (00422fd4)]
0040D8BD   mov         dword ptr [ebp-10h],ecx
0040D8C0   mov         edx,dword ptr [string "world12345678"+8 (00422fd8)]
0040D8C6   mov         dword ptr [ebp-0Ch],edx
0040D8C9   mov         ax,[string "world12345678"+0Ch (00422fdc)]
0040D8CF   mov         word ptr [ebp-8],ax
100:      printf("%s\n %s\n", s, arr);
0040D8D3   lea         ecx,[ebp-14h]
0040D8D6   push        ecx
0040D8D7   mov         edx,dword ptr [ebp-4]
0040D8DA   push        edx
0040D8DB   push        offset string "%s\n %s\n" (00422fb8)
0040D8E0   call        printf (0040d710)

  

果然,又多了几个字节,还是按照既定的策略进行常量区域字符串的copy。

 

posted @   bonelee  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2022-04-04 web3游戏——核心理念是将区块链的平等思想纳入其中,用户参与度会更高,可以防止游戏公司割你韭菜
2018-04-04 g00 网站说明
2017-04-04 日元兑换——国内兑换需要护照和签证,国外的机场有兑换ATM
点击右上角即可分享
微信分享提示