为什么在调试时在函数中初始化字符串不像 int 那样工作
Why does initializing a string in a function doesn't work like int while debugging
所以我今天尝试调试一些简单的 C 程序;
第一个是
int main(){
int a ,b ;
return 0 ;
}
反编译时给了我
push ebp
mov ebp,esp
sub esp,008h
因为我需要有 8 个字节来将 a 和 b 存储在当前堆栈帧中,因为它们是局部变量!
但是当我尝试用字符串做同样的事情时说
int main() {
char greeting[12] = "Pwnit2Ownit";
return 0;
}
反编译时给了我
push ebp
mov ebp,esp
sub esp,0DCh
0DCh 是 220 ,
但是由于字符串只有 12 个字节长不应该
sub esp,0DCh
成为
sub esp,00ch
相反?
任何人都可以分享一些关于字符串如何存储在内存中并稍后通过汇编访问的链接[最好是指令],比如如果长度很大,字符串问候语是如何存储在内存中的,因为我们无法存储所有在堆栈本身
正如@user3386109 所指出的,问题是为了防止溢出 visual studio 中的默认安全检查已启用,它提供了额外的 space 以防止溢出,因此将其关闭,让编译器只分配 12 个字节 :D
关闭此安全措施(缓冲区安全检查 GS)
项目设置 -> C/C++ -> 代码生成 -> 安全检查 = 禁用 GS
一些 post 与 GS
有关
http://preshing.com/20110807/the-cost-of-buffer-security-checks-in-visual-c/
所以我今天尝试调试一些简单的 C 程序;
第一个是
int main(){
int a ,b ;
return 0 ;
}
反编译时给了我
push ebp
mov ebp,esp
sub esp,008h
因为我需要有 8 个字节来将 a 和 b 存储在当前堆栈帧中,因为它们是局部变量!
但是当我尝试用字符串做同样的事情时说
int main() {
char greeting[12] = "Pwnit2Ownit";
return 0;
}
反编译时给了我
push ebp
mov ebp,esp
sub esp,0DCh
0DCh 是 220 , 但是由于字符串只有 12 个字节长不应该
sub esp,0DCh
成为
sub esp,00ch
相反?
任何人都可以分享一些关于字符串如何存储在内存中并稍后通过汇编访问的链接[最好是指令],比如如果长度很大,字符串问候语是如何存储在内存中的,因为我们无法存储所有在堆栈本身
正如@user3386109 所指出的,问题是为了防止溢出 visual studio 中的默认安全检查已启用,它提供了额外的 space 以防止溢出,因此将其关闭,让编译器只分配 12 个字节 :D
关闭此安全措施(缓冲区安全检查 GS) 项目设置 -> C/C++ -> 代码生成 -> 安全检查 = 禁用 GS
一些 post 与 GS
有关http://preshing.com/20110807/the-cost-of-buffer-security-checks-in-visual-c/