- 論壇徽章:
- 0
|
LZ的想法還是好的
確實C語言里, 一定要把指針的地址搞通,
同時程序運行空間結構, 以及匯編之類了解后, 你會有更深刻的認識。
至于*((int*)str-6) 這個位置, 不同的系統(tǒng)包括總線位數不同, 不同的編譯器, 甚至是同一編譯器的
不同版本, 都有可能是不同的。
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的原因, 你忽視了 先后。。 |
|