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

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 5053 | 回復: 10
打印 上一主題 下一主題

修改被調用函數的參數值 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2010-11-06 17:25 |只看該作者 |倒序瀏覽
本帖最后由 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. }
復制代碼
win32下調試了一下

*((int*)str-6) 的地址和 t函數中的的s地址一樣
而在main中修改了這個地址的值,地址是完全對應,但printf結果還是abc

論壇徽章:
0
2 [報告]
發(fā)表于 2010-11-08 09:07 |只看該作者

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
3 [報告]
發(fā)表于 2010-11-08 09:25 |只看該作者
“abc”是個字符串常量,優(yōu)化的緣故?

論壇徽章:
0
4 [報告]
發(fā)表于 2010-11-08 11:56 |只看該作者
如果是常量,那么應該是非法訪問寫入,但程序正常運行

希望更多牛人解答一下

論壇徽章:
0
5 [報告]
發(fā)表于 2010-11-08 16:58 |只看該作者
Linux(Ubuntu 10.10) i386環(huán)境

兩個地址不一樣~

論壇徽章:
0
6 [報告]
發(fā)表于 2010-11-08 17:27 |只看該作者
vc 下不一樣too

論壇徽章:
0
7 [報告]
發(fā)表于 2010-11-09 10:46 |只看該作者
冒死再頂一下,樓上兩位在不同的環(huán)境下
*((int*)str- n 找準一下 可能是4或者3

論壇徽章:
0
8 [報告]
發(fā)表于 2010-11-09 11:30 |只看該作者
大家可能會覺得很奇怪,應該說還是一名C語言新手,為什么老是問這樣的問題,
但是我覺得C語言的基本就是指針,地址的天下,搞清了它們,C語言就可以說找到門道了,
學習靠的是方法,寫代碼的同時還要知道為什么,
譬如這個問題就和它們息息相關,希望高人不惜賜教.

論壇徽章:
0
9 [報告]
發(fā)表于 2010-11-09 17:46 |只看該作者
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的原因, 你忽視了 先后。。

論壇徽章:
0
10 [報告]
發(fā)表于 2010-11-10 08:54 |只看該作者
多磨嘰一點 地址也不是那么容易被猜到的 否則程序就太不安全了
可以google一下Address space layout randomization
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯網協會會員  聯系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP