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。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2022-04-04 web3游戏——核心理念是将区块链的平等思想纳入其中,用户参与度会更高,可以防止游戏公司割你韭菜
2018-04-04 g00 网站说明
2017-04-04 日元兑换——国内兑换需要护照和签证,国外的机场有兑换ATM