大师请进,在linux上,好像无法对栈上的内容进行修改?
时间:2010-06-27
来源:互联网
- char* lowercase(char string[]){
- int i=0;
- char* res = string;
- for(i=0;string[i];i++){
- string[i] += 32;
- }
- return (res);
- }
-
- int main(void){
- char* dest = " HELlo WosLD ";
- dest = lowercase(dest);
- printf("the string after lowercase:%s\n",dest);
-
- }
作者: ikewu83 发布时间: 2010-06-27
作者: prolj 发布时间: 2010-06-27
prolj 发表于 2010-06-27 14:25
嗯,而且不是栈上数据。
作者: 变异老鼠 发布时间: 2010-06-27
先谢谢了,那么一般在写类似Lowercase函数的时候,假设它的输入不是rodata吗?有什么更变通的方法?
作者: ikewu83 发布时间: 2010-06-27
作者: prolj 发布时间: 2010-06-27
这个好像会跑错。我的问题是我们一定要假设类似lowercase函数的输入不是rodata吗?有什么更变通的方法?
作者: ikewu83 发布时间: 2010-06-27
- .file "hack1.c"
- .text
- .globl lowercase
- .type lowercase, @function
- lowercase:
- pushl %ebp
- movl %esp, %ebp
- subl $16, %esp
- movl $0, -4(%ebp)
- movl 8(%ebp), %eax
- movl %eax, -8(%ebp)
- movl $0, -4(%ebp)
- jmp .L2
- .L3:
- movl -4(%ebp), %eax
- addl 8(%ebp), %eax
- movl -4(%ebp), %edx
- addl 8(%ebp), %edx
- movzbl (%edx), %edx
- addl $32, %edx
- movb %dl, (%eax)
- addl $1, -4(%ebp)
- .L2:
- movl -4(%ebp), %eax
- addl 8(%ebp), %eax
- movzbl (%eax), %eax
- testb %al, %al
- jne .L3
- movl -8(%ebp), %eax
- leave
- ret
- .size lowercase, .-lowercase
- .section .rodata
- .LC0:
- .string " HELlo WosLD "
- .align 4
- .LC1:
- .string "the string after lowercase:%s\n"
- .text
- .globl main
- .type main, @function
- main:
- pushl %ebp
- movl %esp, %ebp
- andl $-16, %esp
- subl $32, %esp
- movl $.LC0, 28(%esp)
- movl 28(%esp), %eax
- movl %eax, (%esp)
- call lowercase
- movl %eax, 28(%esp)
- movl $.LC1, %eax
- movl 28(%esp), %edx
- movl %edx, 4(%esp)
- movl %eax, (%esp)
- call printf
- leave
- ret
- .size main, .-main
- .ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
- .section .note.GNU-stack,"",@progbits
.L0就是你的字符串的地址
在只读段
我懒得看了,你自己看吧
作者: ah13k 发布时间: 2010-06-27
作者: prolj 发布时间: 2010-06-27
阴雨阿,阴雨阿!
作者: peidright 发布时间: 2010-06-27
作者: ling0088 发布时间: 2010-06-27
回复 ling0088
大师,我就是想知道在写类似Lowercase函数的时候,假设它的输入不是rodata吗?有什么更变通的方法?也就是怎么写的规范点?
作者: ikewu83 发布时间: 2010-06-27
大师,我就是想知道在写类似Lowercase函数的时候,假设它的输入不是rodata吗?有 ...
ikewu83 发表于 2010-06-27 20:22
先搞清概念。嗯。



作者: donglongchao 发布时间: 2010-06-27
作者: Magic_LP 发布时间: 2010-06-27
char* dest = " HELlo WosLD ";
dest指向的是字符串是只读的
string += 32;
你修改只读的字符串所以出错了
改成 char dest[] = " HELlo WosLD "; 试试
作者: kmindg 发布时间: 2010-06-27
作者: 没本 发布时间: 2010-06-28
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28