欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3148|回復: 0
打印 上一主題 下一主題
收起左側

理解子程序程序調用的堆棧和寄存器的變化

[復制鏈接]
跳轉到指定樓層
樓主
ID:107189 發表于 2016-3-6 00:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
Hobo(756085934) 20:32:00
#incldue<stdio.h>
void print(void)
{
    printf("why here??");
}
void main(int argc,char** argv)
{
   int buf[1];
   buf[2]=print;
   return;
}
結果輸出:
why here??
Hobo(756085934) 20:33:03
這種事情真的是太有意思了
揚(375357907) 20:34:35
hobo那個編譯通不過啊
Hobo(756085934) 20:34:56
傳說中緩沖區溢出,經常被黑客利用
揚(375357907) 20:35:15
怎么我編譯有錯誤呢
Hobo(756085934) 20:35:14
編譯能通過的,
揚(375357907) 20:35:23
are you sure?
Hobo(756085934) 20:35:28
sure
揚(375357907) 20:35:29
我用vc編譯的通不過
Hobo(756085934) 20:35:43
你等我看下,我是不是哪里寫錯了
小屁孩(595605150) 20:35:53
這個咋能通過...
揚(375357907) 20:35:55
F:\程序\test\test.cpp(10) : error C2440: '=' : cannot convert from 'void (__cdecl *)(void)' to 'int'
        This conversion requires a reinterpret_cast, a C-style cast or function-style cast
F:\程序\test\test.cpp(11) : error C2562: 'main' : 'void' function returning a value
        F:\程序\test\test.cpp(7) : see declaration of 'main'
小車(15157102) 20:36:17
編譯問題都不自行解決。說明還是初學者
Hobo(756085934) 20:36:48
#include<iostream>
using namespace std;
void print(void)
{
cout<<"why here??"<<endl;
_exit(0);
}
int main()
{
int buf[1] ;
buf[2] = (int)print;
cout<<"watch out what happenning.."<<endl;
return 1;
}
Hobo(756085934) 20:36:58
你再試試這個
Hobo(756085934) 20:37:50
通過沒啊??
Hobo(756085934) 20:37:54
編譯??
揚(375357907) 20:38:18
呵呵
揚(375357907) 20:38:33
void 的 main
金水火(57024564) 20:38:44
呵呵。
揚(375357907) 20:38:46
不過為什么啊,能解釋下嗎
Hobo(756085934) 20:39:15
需要匯編才能解釋,我還有點蒙
揚(375357907) 20:39:48
why here?
Hobo(756085934) 20:39:48
具體細節在壓棧退棧的時候
揚(375357907) 20:40:33
繼續
Hobo(756085934) 20:40:46
我不懂匯編了,看不懂
Hobo(756085934) 20:41:18
進入main 函數后的棧內容下:
[ eip ][ ebp ][ buff[0] ]
高地址<---- 低地址
以上3 個存儲單元中eip 為main 函數的返回地址,buff[0]單元就是buff 申明的一個int
空間。程序中我們定義int buff[1],那么只有對buff[0]的操作才是合理的(我們只申請
了一個int 空間),而我們的buff[2]=why_here 操作超出了buff 的空間,這個操作越界了,
也就是溢出了。溢出的后果是: 對buff[2]賦值其實就是覆蓋了棧中的eip 存放單元的數
據,將main 函數的返回地址改為了why_here 函數的入口地址。這樣main 函數結束后返回
的時候將這個地址作為了返回地址而加以運行。
Hobo(756085934) 20:41:27
原文的描述
小屁孩(595605150) 20:44:11

揚(375357907) 20:44:20
呵呵,明白了,學習學習
金水火(57024564) 20:44:21
相當于return print()?
小屁孩(595605150) 20:44:22
不對吧,怎么會執行
cyt(53238) 20:44:39
啥事?
小屁孩(595605150) 20:45:12
只是把函數指針強制轉成int存放在未分配的空間了
Hobo(756085934) 20:45:14
返回地址應該是下一條指令執行的地址吧
金水火(57024564) 20:45:32
#incldue<stdio.h>
void print(void)
{
    printf("why here??");
}
void main(int argc,char** argv)
{
   int buf[1];
   buf[2]=print;
   return 1;
}
結果輸出:
why here??
金水火(57024564) 20:45:36
cyt 看下
小屁孩(595605150) 20:45:52
我這沒輸出哎why here哎
揚(375357907) 20:46:00
我靠,真的?
揚(375357907) 20:46:08
可能是編譯器的 問題?
Hobo(756085934) 20:46:15
  buf[2]=(int)print;
小屁孩(595605150) 20:46:55

小屁孩(595605150) 20:47:12
警告里面說了嘛,函數指針強制轉換為int
Hobo(756085934) 20:47:12
return ;
不帶1
小屁孩(595605150) 20:48:10
void print(void)
{
    printf("why here??\n");
_exit(0);
}
#if 1
int main(int argc, char* argv[])
{
  int buf[1];
   buf[2]=  (int)print;
   return 0;
}
小屁孩(595605150) 20:48:28

啥都沒輸出
小屁孩(595605150) 20:48:51
根本沒進函數體哎
Hobo(756085934) 20:49:11
不會吧
cyt(53238) 20:49:33
hobo上面的解釋基本正確呀,不過有個地方
進入main 函數后的棧內容下:
[ eip ][ ebp ][ buff[0] ]
那buff[1]覆蓋的是ebp,不是eip呀
小屁孩(595605150) 20:49:55
為啥我執行沒顯示呢?
cyt(53238) 20:50:19
你的編譯是不是設定了int缺省是64位呀?
Hobo(756085934) 20:50:36
我抄資料的,匯編不熟
cyt(53238) 20:51:18
哦,你寫的是buff[2],是我看錯
小屁孩(595605150) 20:51:54
cyt,為啥我執行沒執行函數呢?
cyt(53238) 20:52:38
所以我你的編譯器是不是指定了int是64位?
cyt(53238) 20:52:55
你用什么編譯器?
金水火(57024564) 20:53:13
一般是vc吧
小屁孩(595605150) 20:53:16
32位,cl,vc2005
cyt(53238) 20:53:47
vc可以看匯編的呀,看看編譯出來的匯編是什么?
揚(375357907) 20:54:45
我用gcc提示段錯誤
Hobo(756085934) 20:54:52
cyt,進入main后,ebp里放的是什么
cyt(53238) 20:56:33
堆棧里面放ebp,然后ebp記著當前的esp,然后esp往前增長,esp和ebp之間的就是傳輸參數
cyt(53238) 20:57:19
好像大概是這樣子吧,太久不搞
cyt(53238) 20:57:49
哦,錯了
Hobo(756085934) 20:59:00
那假如是一個int buffer[10]的話,是不是eip存放返回地址,ebp存放當前堆棧段的指針,緊接著是大小為10的數組?
cyt(53238) 20:59:32
應該是 eip返回地址,記錄ebp,然后參數壓棧,然后ebp = esp,然后esp往前增長。esp和ebp之間的就是函數內用的變量,ebp之前的就是參數。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表