- 论坛徽章:
- 0
|
LZ的想法还是好的
确实C语言里, 一定要把指针的地址搞通,
同时程序运行空间结构, 以及汇编之类了解后, 你会有更深刻的认识。
至于*((int*)str-6) 这个位置, 不同的系统包括总线位数不同, 不同的编译器, 甚至是同一编译器的
不同版本, 都有可能是不同的。
gcc -S 后看一下函数t:
.globl t
.type t, @function
t:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl 8(%ebp), %eax
movl %eax, 8(%esp)
leal 8(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC3, (%esp)
call printf
leave
ret
简单的看一下t这个函数, 你本意想要改的无非是t函数中, 调用printf 之前的8(%esp) 的位置
即使你的偏移计算正确, 在调用t之前修改了这个位置, 实际上调用t的过程是:
把参数放在了 call t 时的 (%esp) 处
进入t函数后,
movl 8(%ebp), %eax
movl %eax, 8(%esp)
s在t中的堆栈位置, 会被重写。
so 。。 即使你之前的 偏移 计算正确, 编译器也会在调用函数时给你重写掉
这是为啥还是输出abc的原因, 你忽视了 先后。。 |
|