亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 修改被調(diào)用函數(shù)的參數(shù)值 [打印本頁(yè)]

作者: hitty    時(shí)間: 2010-11-06 17:25
標(biāo)題: 修改被調(diào)用函數(shù)的參數(shù)值
本帖最后由 hitty 于 2010-11-09 10:46 編輯

  1. int main()
  2. {
  3.     char str[] = "1234567";
  4.     *((int*)str-6)=str;
  5.     t("abc");
  6.     printf("\n%p\n",(int*)str-6);
  7.     return 0;
  8. }


  9. void t(char s[])
  10. {
  11.     printf("%p,%s\n",&s,s);
  12. }
復(fù)制代碼
win32下調(diào)試了一下

*((int*)str-6) 的地址和 t函數(shù)中的的s地址一樣
而在main中修改了這個(gè)地址的值,地址是完全對(duì)應(yīng),但printf結(jié)果還是abc
作者: hitty    時(shí)間: 2010-11-08 09:07

作者: hellioncu    時(shí)間: 2010-11-08 09:25
“abc”是個(gè)字符串常量,優(yōu)化的緣故?
作者: hitty    時(shí)間: 2010-11-08 11:56
如果是常量,那么應(yīng)該是非法訪問寫入,但程序正常運(yùn)行

希望更多牛人解答一下
作者: 還魂僵尸    時(shí)間: 2010-11-08 16:58
Linux(Ubuntu 10.10) i386環(huán)境

兩個(gè)地址不一樣~
作者: jimmyixy    時(shí)間: 2010-11-08 17:27
vc 下不一樣too
作者: hitty    時(shí)間: 2010-11-09 10:46
冒死再頂一下,樓上兩位在不同的環(huán)境下
*((int*)str- n 找準(zhǔn)一下 可能是4或者3
作者: hitty    時(shí)間: 2010-11-09 11:30
大家可能會(huì)覺得很奇怪,應(yīng)該說還是一名C語言新手,為什么老是問這樣的問題,
但是我覺得C語言的基本就是指針,地址的天下,搞清了它們,C語言就可以說找到門道了,
學(xué)習(xí)靠的是方法,寫代碼的同時(shí)還要知道為什么,
譬如這個(gè)問題就和它們息息相關(guān),希望高人不惜賜教.
作者: BJSH    時(shí)間: 2010-11-09 17:46
LZ的想法還是好的
確實(shí)C語言里, 一定要把指針的地址搞通,
同時(shí)程序運(yùn)行空間結(jié)構(gòu), 以及匯編之類了解后, 你會(huì)有更深刻的認(rèn)識(shí)。

至于*((int*)str-6) 這個(gè)位置, 不同的系統(tǒng)包括總線位數(shù)不同, 不同的編譯器, 甚至是同一編譯器的
不同版本, 都有可能是不同的。

gcc -S 后看一下函數(shù)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

簡(jiǎn)單的看一下t這個(gè)函數(shù), 你本意想要改的無非是t函數(shù)中, 調(diào)用printf 之前的8(%esp) 的位置

即使你的偏移計(jì)算正確, 在調(diào)用t之前修改了這個(gè)位置, 實(shí)際上調(diào)用t的過程是:

把參數(shù)放在了 call t 時(shí)的 (%esp) 處
進(jìn)入t函數(shù)后,
movl    8(%ebp), %eax
movl    %eax, 8(%esp)

s在t中的堆棧位置, 會(huì)被重寫。


so 。。 即使你之前的 偏移 計(jì)算正確, 編譯器也會(huì)在調(diào)用函數(shù)時(shí)給你重寫掉

這是為啥還是輸出abc的原因, 你忽視了 先后。。
作者: lenky0401    時(shí)間: 2010-11-10 08:54
多磨嘰一點(diǎn) 地址也不是那么容易被猜到的 否則程序就太不安全了
可以google一下Address space layout randomization
作者: hitty    時(shí)間: 2010-11-12 17:57
LZ的想法還是好的
確實(shí)C語言里, 一定要把指針的地址搞通,
同時(shí)程序運(yùn)行空間結(jié)構(gòu), 以及匯編之類了解 ...
BJSH 發(fā)表于 2010-11-09 17:46



    非常感謝




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2