青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

麒麟子

~~

導航

<2025年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

統(tǒng)計

常用鏈接

留言簿(12)

隨筆分類

隨筆檔案

Friends

WebSites

積分與排名

最新隨筆

最新評論

閱讀排行榜

評論排行榜

討論會:一個不是問題的問題!

 

 1#include <iostream>
 2using namespace std;
 3void test( void )
 4{
 5 cout << "Success!" << endl;
 6}

 7int main( void )
 8{
 9 int a[ 1 ];
10 int* p = (int*)&a[0]+3;
11
12 *=  ( int )test;
13 return 0;
14}

15
16


首先,這個不是特性,也不是什么BUG,也不是什么,純屬娛樂! 對了,請大家不要用Release模式等會進行優(yōu)化的編譯方案。
很明顯,上面的a和p都是臨時變量,并且沒有使用。。優(yōu)化就啥都沒了。 我用的是VS 2005  其它環(huán)境。

執(zhí)行時,輸出 Success!

提示: 輸出時會DOWN掉,不過不影響結果的查看!


不知道各位有何高見!
我心中也有一個答案。但先不說,大家一起來討論。。。 共同完成這篇貼子。 隨后,大家的高端回復會以如下方式出現(xiàn)
如果不希望最后出現(xiàn)在這里,請大家注明。 默認情況下,表示同意!

ID:XXXX
解釋:*****************


=======================
ID:XXXXX
解釋:********************

posted on 2010-05-06 12:41 麒麟子 閱讀(2148) 評論(38)  編輯 收藏 引用 所屬分類: Programming

評論

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 12:54 夢在天涯

什么也沒有輸出吧1

那估計輸出了也是隨即的!  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 13:04 打醬油的

不會有輸出。也不會出現(xiàn)CORE DUMP  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 13:06 schindlerlee

。。。這不就是指針段內偏移指向函數(shù)了么
而且是和編譯器有關的,不同的編譯器生成的結果不一定相同。
這是bug,不是特性。  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 13:11 skykrnl

其實原理很簡單,系統(tǒng)調用 main 函數(shù)的時候先壓入了 返回地址,
現(xiàn)在 p 恰好位于棧中返回地址處,然后你修改成了test函數(shù),main函數(shù)退出后發(fā)現(xiàn)將返回地址是test函數(shù),于是跳過去執(zhí)行啦。
程序崩潰時必然的,你沒有ExitProcess.  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 13:14 小時候可靚了

@skykrnl
嗯,過程是這樣的。。 但我想看看大家目前到底有多無聊。能把這個問題提升到一個什么樣的層次! 一起來吧,哈哈  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 13:25 打醬油的

這個問題以前試驗過了,但是gcc沒有生成對main的函數(shù)調用,所以這個效果沒有出來。改一下就可以了:

#include <iostream>
using namespace std;
void test( void )
{
cout << "Success!" << endl;
}
void test2(void)
{
int a[ 1 ];
int* p = (int*)&a[0]+2;

*p = ( int )test;
}
int main( )
{
test2();
return 0;
}
  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 13:28 小時候可靚了

@打醬油的
嗯,自己構造,只要地址偏移正確就OK啦!  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 13:40 小時候可靚了

在VS中,我們還可以這樣

#include <iostream>
using namespace std;
void test( void )
{
cout << "Success!" << endl;
}
int main( void )
{
_asm
{
mov dword ptr[ebp+4],offset test;把test的地址給返回地址
}
return 0;
}  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 13:58 Kevin Lynx

這個可以從call和ret指令所做的事情來看,更涉及到函數(shù)調用在編譯器以及目標機器指令問題。不過因為這里不存在虛擬機問題,都是x86,也就只針對call和ret而言:

不難想象在main之前的地方有如下代碼:
; 壓參數(shù)
push xxx
push xxx
push xxx
call main

;main
xxx
xxx
ret

首先call的動作主要包括:先壓入返回地址到堆棧上(ebp指向),而c函數(shù)中,函數(shù)負責堆棧平衡,那么main中清除局部變量,改變ebp后,可以肯定ebp指向的當前堆棧中的值就是返回地址。ret指令則是從棧頂取出該地址并執(zhí)行PC寄存器的跳轉。

另一方面,函數(shù)調用時的運行時堆棧問題:首先棧是向下增長的,函數(shù)A調用函數(shù)B,那么首先壓入參數(shù)到棧中,在函數(shù)B中因為局部變量的增長棧繼續(xù)向下增長,也就是說,最終可以通過ebp的偏移取得函數(shù)A中局部變量的信息。他們貢獻同一個棧:
--stack--
A:local_var1
A:local_var2
A:ret_addr
B:arg_var1
B:arg_var2
B:local_var1
....
基于以上兩個條件,指針a[0]+3,則向高地址偏移了12字節(jié)的地址(3*sizeof(int)),看下main函數(shù)的參數(shù),實際上是3個:argc, argv, env。這樣偏移后,恰好就是調用main那個函數(shù)在使用call時,壓入的返回地址。

因此,在main返回時,ret彈出的地址已經被改變。

ps:
在錯誤地跳轉到test后,test執(zhí)行完去ret時,堆棧上提供的返回地址是不定的,崩潰也很正常了。  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 14:03 小時候可靚了

@Kevin Lynx
嗯,分析得很好哦。。但是,我覺得這和main的參數(shù)沒關系。。偏移到ret_addr就已經停下了。還沒經過B:arg_var1 B:arg_var2 B:local_var1  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 14:57 春續(xù)

*p = ( int )test;

這句沒看明白。
  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 15:11 飯中淹

1- CALL會把下一個指令的地址放進堆棧。
2- RET就讓這個地址出棧,并跳轉至這個地址。
3- 局部變量也是在棧上的。

代碼中,你用局部變量的地址定位到棧內的ret返回地址,然后將其修改為TEST的函數(shù)地址。RET后,就跳轉到TEST函數(shù)了。因為沒有CALL,所以棧內不會壓入返回地址,然后棧就亂掉了,后面依賴棧的指令,就可能會導致出錯。

在一些軟件保護里面,經常會用到這種手段,PUSH FUNCPTR, RET。這樣可以用CALL來調用函數(shù)。從而迷惑分析者。通過ESP寄存器直接操作,更讓分析者頭大。再用一些無效指令插在其中,做成花指令,就更高端了。特別是花連跳,分析者就很難一眼分辨出走向了。

  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 15:19 Kevin Lynx

@小時候可靚了
我說的是有點問題。跟參數(shù)沒關系。參數(shù)先于返回地址壓棧。- - 昏頭了。

話說回來,仔細分析的話,我突然發(fā)覺:
int* p = (int*)&a[0]+3;
這里為什么會是3呢?跟了下匯編,發(fā)覺直接被翻譯為ebp+4了:
push ebp
mov ebp, esp
...
mov eax, [ebp+4]

不是很明白這個地方。

飯老大說得和我一樣。  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。[未登錄] 2010-05-06 15:30

典型的 "撞大運編程"  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 15:33 小時候可靚了

@Kevin Lynx
int a;
int *p
這兩個是臨時變量

a 的地址是 ebp -8
p 的地址是 ebp-4
所以,&a[0]+3其實就是 ebp-8+ 3*4 = ebp+4  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 15:34 小時候可靚了

@壞
撞大運和這可不一樣。 這是明明知道的后果!  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 15:41 Kevin Lynx

@小時候可靚了
a 的地址是 ebp -8
p 的地址是 ebp-4

這兩個結論從何而來?何況,為什么要+3?

ps,話說這樣N多回復會給你BLOG增加不少積分啊 :D  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 15:51 小時候可靚了

@Kevin Lynx
都說了,這個程序是故意寫出來的。不是撞大運撞的。 +3是為了正好得到我們的偏移地址! 上面那個結論,就是臨時變量在棧上分配內存分成那樣的撒。至于BLOG的分,我不知道這回事!  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 15:51 飯中淹

@Kevin Lynx
p的地址大于a。
所以a在棧頂,p在a下面。還有個push ebp,接下來就是返回地址。
正好三個。  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 15:52 小時候可靚了

@飯中淹
嗯,就是這樣的。 不過如果你在DEBUG下看的話,會發(fā)現(xiàn)a不在棧頂。 DEBUG會多分一些  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 16:07 Kevin Lynx

@小時候可靚了
{
int a;
int b;
int c;
}
按我的理解,c應該在棧頂,而不是a。但是實際上跟蹤你的代碼來看,a確實在棧頂,在p后添加變量int i ,又有意外:
a : 0x0012ff74
&p:0x0012ff78
&i:0x0012ff70
  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。[未登錄] 2010-05-06 16:15

@小時候可靚了
在我這里gcc和BCB都是無任何輸出的。
隨便在前面加個局部變量VC也同樣無輸出。
這不就是撞大運么....  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 16:16 Kevin Lynx

@壞
需要適當調整 3 這個偏移量

ps,當然也取決于編譯器生成的指令。鑒于目前我也不明白為什么偏移是3,看起來LZ也無法給出詳細的說明,這個3很有可能只是個巧合。

1、除了push ebp外可能還有壓入其他寄存器的值(保存寄存器信息)
2、a理論上應該不在棧頂,就像我例子中的i,而p應該在棧頂
  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 16:33 小時候可靚了

@Kevin Lynx
棧頂是低地址~~  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 16:36 Kevin Lynx

@小時候可靚了
這個不需要你重申,我更不希望我來重申我的問題:
解釋下這個:
int a[1];
int *p;
int i;

a : 0x0012ff74
&p:0x0012ff78
&i:0x0012ff70

注意p在中間 。  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 16:38 小時候可靚了

@Kevin Lynx
這個巧合是建立在剛剛那個代碼上的。。這個+3,是人為構造的。 不管+幾,我們就是想把他指向main的返回地址。

不過呢,在編譯器環(huán)境條件眾多的情況下, 如 @壞 所說,真是撞大運。

至于合理的解釋,上面有兄弟給了答案了。。。  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 16:42 小時候可靚了

@Kevin Lynx
其實我貼出來,同樣是想看到關于這個臨時空間的解釋。。你知道嗎?在我的機器上是這樣的。
0x0012ff60
0x0012ff54
0x0012ff48

如果我能一一解釋清楚,我就不讓大家討論了。。。 嘿嘿  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 16:42 Kevin Lynx

@小時候可靚了
飯給的解釋是我在群里跟他談過的。
這個解釋是我在看匯編的時候看到的:
00401750 push ebp
00401751 mov ebp,esp
00401753 sub esp,0Ch
00401756 lea eax,[ebp+4]
00401759 mov dword ptr [p],eax

恰好a莫名其妙地出現(xiàn)在棧頂,而不是p,(而在我舉的包含i的例子中,作為出現(xiàn)在最后定義的i卻莫名其妙地出現(xiàn)在棧頂),加上這個push ebp,就出現(xiàn)了3。

誰能給個解釋:為什么a、p、i三者的相對地址和其定義順序存在差別?(難道編譯器對數(shù)組的處理要特殊點?)
  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 16:43 Kevin Lynx

@小時候可靚了
0x0012ff60 a
0x0012ff54 p
0x0012ff48 i ???
如果是這樣的話,那這個才是正確的排列地址啊。詭異的是我那個情況。  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 16:44 小時候可靚了

@Kevin Lynx
可是,他們的差值很鬼異!  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 16:45 Kevin Lynx

@小時候可靚了
剛想補上這句,差距都是12.。。- -
我這邊差距都是4,正常差距,但是順序詭異。。。  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 16:59 Kevin Lynx

唉,淡定吧。這種情況讓我頭疼。  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 17:01 Kevin Lynx

汗。。- - 。。偶然間看到LZ 博客HGE一欄居然轉載有我N久以前亂寫的東西,真巧啊。。  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 17:03 小時候可靚了

@Kevin Lynx
是啊,以前在學校的時候,搗鼓了兩天HGE。  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 19:00 zuhd

又是offset.....看了王爽匯編之后,你一定會發(fā)現(xiàn)這復雜的世界又是多么的和諧  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。 2010-05-06 19:30 小時候可靚了

@zuhd
王爽的我沒看過耶!??! 汗!??!  回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。[未登錄] 2010-05-11 21:49 海邊沫沫

高手好多哦。你們想得太復雜了。

我認為這一句
*p = ( int )test;
調用了test函數(shù),只不過test函數(shù)沒有返回值,且p指向非法內存,所以給*P賦值就會犯錯,于是程序就會掛掉。

樓主說的特性是不是test和test()是一樣的?。?nbsp; 回復  更多評論   

# re: 討論會:高手們都來看看,這個如何解釋。[未登錄] 2010-05-11 22:02 海邊沫沫

我發(fā)現(xiàn)我上面的結論錯了。剛才把代碼輸入到VS2008,調試了一下。發(fā)現(xiàn):
*p=(int)test;確實只是把test的地址放到了*p里面,而不是調用test();

而在return的時候調用了test,然后出錯。

說明*p這個非法內存訪問是真的改變了main函數(shù)返回后執(zhí)行的下一條指令的地址。  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区二区在线看| 欧美人与禽猛交乱配视频| 欧美本精品男人aⅴ天堂| 久久精品亚洲一区| 久久精品国产欧美激情| 久久久国产精品亚洲一区| 久久国产一区二区| 蜜桃av一区二区三区| 最新国产の精品合集bt伙计| 亚洲日本欧美在线| 亚洲欧美日本精品| 免费亚洲婷婷| 国产精品av免费在线观看| 国产欧美日本| 亚洲精品一区二区三| 亚洲男女自偷自拍| 欧美大胆a视频| 亚洲天堂av高清| 久久综合伊人77777蜜臀| 欧美日韩一区国产| 极品尤物久久久av免费看| 999亚洲国产精| 亚洲欧美韩国| 在线激情影院一区| 欧美成人精品| 一区二区三区三区在线| 久久国内精品视频| 欧美超级免费视 在线| 国产精品成人免费视频 | 久久影院午夜论| 欧美日韩国产另类不卡| 国产亚洲精品自拍| 亚洲在线观看视频网站| 欧美激情五月| 性欧美暴力猛交69hd| 欧美三级精品| 亚洲黄色精品| 久久精品国产成人| 亚洲视频在线观看| 欧美日韩国产片| 亚洲电影免费在线| 久久亚洲电影| 欧美一级免费视频| 国产精品videossex久久发布| 亚洲国产成人精品女人久久久 | 久久最新视频| 亚洲在线观看视频网站| 欧美日韩国产成人在线| 激情婷婷欧美| 久久经典综合| 亚洲欧美日韩爽爽影院| 洋洋av久久久久久久一区| 亚洲欧美一区二区原创| 亚洲久久视频| 欧美高清在线| 日韩午夜视频在线观看| 亚洲人成欧美中文字幕| 久久九九国产| 午夜精品国产更新| 国产日韩欧美在线一区| 亚洲专区在线| 亚洲午夜国产成人av电影男同| 欧美理论电影在线播放| 日韩一区二区电影网| 亚洲人成人77777线观看| 欧美精品一区二区在线播放| 夜夜嗨av一区二区三区四区| 亚洲精品乱码久久久久久黑人| 欧美精品福利视频| 一区二区日本视频| 一本久道久久综合中文字幕| 国产精品久久久久久久久借妻| 亚洲免费网站| 欧美一区二区三区婷婷月色 | 久久精品一区二区国产| 亚洲欧美日韩一区二区| 国产亚洲欧美日韩在线一区| 久久亚洲电影| 欧美精品v日韩精品v韩国精品v | 国产日韩欧美在线观看| 噜噜噜躁狠狠躁狠狠精品视频| 麻豆av一区二区三区| 一本色道久久综合亚洲精品不 | 久久国产精品第一页| 国产在线欧美| 欧美福利在线| 欧美日韩亚洲免费| 欧美一区二区私人影院日本| 久久国产精品72免费观看| 亚洲高清久久| 夜夜爽99久久国产综合精品女不卡| 欧美日韩一区二区在线观看| 久久久www免费人成黑人精品| 欧美.www| 欧美在线亚洲综合一区| 久久精品官网| 在线一区二区三区四区五区| 午夜精品美女久久久久av福利| 黑丝一区二区| 一本色道精品久久一区二区三区| 国精品一区二区| 夜夜嗨av色综合久久久综合网| 国模私拍视频一区| 99综合电影在线视频| 极品日韩久久| 亚洲一区美女视频在线观看免费| 亚洲福利视频一区| 亚洲免费在线视频| 亚洲精品国产拍免费91在线| 性伦欧美刺激片在线观看| 日韩午夜激情| 久久综合999| 久久精品国产77777蜜臀| 欧美精品一区二区三区在线播放| 美女任你摸久久| 国产欧美精品一区| 一本色道久久综合亚洲精品不| 亚洲福利小视频| 在线综合欧美| 国产精品99久久久久久www| 久久综合一区二区| 久久亚洲私人国产精品va媚药| 国产精品久久久久久影视 | 亚洲欧美一区在线| 99综合电影在线视频| 久久精品亚洲精品| 午夜精品久久久久| 欧美高清视频一区二区三区在线观看| 国产精品高精视频免费| 欧美第一黄色网| 国产偷久久久精品专区| 亚洲网站视频福利| 亚洲一区二区三区四区五区午夜 | 国产美女搞久久| 亚洲三级免费电影| 日韩写真视频在线观看| 久热成人在线视频| 欧美岛国激情| 亚洲福利视频在线| 麻豆精品一区二区综合av| 毛片精品免费在线观看| 在线精品国产欧美| 久久成人免费网| 久久人人爽爽爽人久久久| 国产在线精品成人一区二区三区| 中文在线资源观看视频网站免费不卡| 在线视频精品一| 国产麻豆一精品一av一免费| 亚洲欧美激情精品一区二区| 午夜精品久久久| 国产欧美亚洲精品| 性8sex亚洲区入口| 欧美国产日韩一区二区| 99精品国产在热久久婷婷| 欧美日韩精品综合| 亚洲欧美清纯在线制服| 美女福利精品视频| av成人免费在线| 国产精品久久影院| 久久久www成人免费无遮挡大片| 亚洲大片免费看| 亚洲天堂免费观看| 国语精品一区| 欧美日韩精品二区| 欧美在线视频一区| 亚洲日本理论电影| 久久精品99国产精品| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美日韩亚洲一区二| 欧美在线观看天堂一区二区三区 | 西瓜成人精品人成网站| 国精品一区二区| 欧美日韩精品免费 | 国产精品尤物| 麻豆久久精品| 香港久久久电影| 99天天综合性| 免费h精品视频在线播放| 亚洲天堂av图片| 亚洲电影在线观看| 国产精品热久久久久夜色精品三区 | 亚洲国产精品悠悠久久琪琪| 羞羞答答国产精品www一本 | 国产精品美女久久久久久2018| 久久免费视频网| 午夜精品视频在线| 好看的亚洲午夜视频在线| 欧美人交a欧美精品| 久久另类ts人妖一区二区| 亚洲丝袜av一区| 亚洲国产女人aaa毛片在线| 久久久亚洲国产美女国产盗摄| 亚洲午夜视频| 日韩亚洲欧美高清| 亚洲激情视频网| 亚洲丶国产丶欧美一区二区三区 | 亚洲欧洲99久久| 在线综合+亚洲+欧美中文字幕| 亚洲欧洲免费视频| 亚洲第一区在线观看|