<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>&#8235;BinaryVision &#187; תוצאות חיפוש  &#187;  פרמטרים&#8236;</title>	<atom:link href="http://www.binaryvision.org.il/?s=%D7%A4%D7%A8%D7%9E%D7%98%D7%A8%D7%99%D7%9D&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.binaryvision.org.il</link>
	<description>&#8235;בלוג טכנולוגי של קבוצת חברים&#8236;</description>	<lastBuildDate>Tue, 17 Aug 2010 16:39:35 +0000</lastBuildDate>
	<language>he</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>&#8235;סקר: עד כמה הראוטר שלכם מעפן ?&#8236;</title>		<link>http://www.binaryvision.org.il/?p=517</link>
		<comments>http://www.binaryvision.org.il/?p=517#comments</comments>
		<pubDate>Fri, 29 Jan 2010 16:59:42 +0000</pubDate>
		<dc:creator>&#8235;spdr&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>

		<guid isPermaLink="false">http://www.binaryvision.org.il/?p=517</guid>
		<description><![CDATA[&#8235;
מבדיקה שעשיתי מסתבר שלהרבה מאוד ראוטרים אפשר להזריק קוד HTML באמצעות פרמטר ה HOSTNAME שמתקבל באמצעות פרוטוקול ה DHCP בזמן ההתחברות לנתב. ואם יש לנתב ממשק ווב שנותן לצפות ב DHCP TABLE או סתם מציג את ה HOSTNAME של המחשבים בכל דף אחר, אפשר לגרום בעצם ל XSS, ואולי אפילו להשיג ZONE פחות מאובטח בגרסאות [...]
&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><p>מבדיקה שעשיתי מסתבר שלהרבה מאוד ראוטרים אפשר להזריק קוד HTML באמצעות פרמטר ה HOSTNAME שמתקבל באמצעות פרוטוקול ה DHCP בזמן ההתחברות לנתב. ואם יש לנתב ממשק ווב שנותן לצפות ב DHCP TABLE או סתם מציג את ה HOSTNAME של המחשבים בכל דף אחר, אפשר לגרום בעצם ל XSS, ואולי אפילו להשיג ZONE פחות מאובטח בגרסאות ישנות של אינטרנט אקספלורר. אני בטח לא הראשון שחשב על זה אבל מהבדיקות שעשיתי 4 מתוך 4 ראוטרים היו פגיעים.</p>
<p>דוגמא לניצול בראוטר של סימנס:</p>
<p><img class="alignnone" src="http://img716.imageshack.us/img716/766/dhcfail.png" alt="" width="462" height="182" /></p>
<p>בינתיים הראוטרים שבדקתי היו:</p>
<pre class="brush: php">

2Wire

D-link

SIEMENS ADSL SL2-141

ובדיקה ידנית מול - Level one WBR 3408 11g
</pre>
<p>העלתי לאתר סקריפט שכתוב בפרל, אז אם בא לכם לעזור בסקר כדי שכולנו נדע איזה ראוטרים בדיוק פגיעים, תורידו את הסקריפט ותריצו נגד הראוטר. הסקריפט ישלח פאקט ֹאחד לפורט UDP 67 ואמור ליצור HOSTNAME עם איזה ערך שאתם רוצים.</p>
<p>אפשרות שניה היא לעשות את הבדיקה בצורה ידנית, דבר פשוט בלינוקס:</p>
<pre class="brush: php">

ifconfig eth0 hw ether 00

hostname &quot;htmlcodehere&quot; # Replace with real code

dhclient
</pre>
<p>השורה הראשונה תשנה את כתובת ה MAC של הכרטיס רשת, השורה השניה תשנה את ה HOSTNAME וצריך להכניס בין הגרשיים קוד HTML כלשהוא עד 64 תווים. השורה השלישית והאחרונה בעצם תבקש כתובת IP מהשרת DHCP עבור ה mac החדש מה שיגרום לרשומה חדשה ב DHCP TABLE.</p>
<p>את הסקריפט שכתוב בפרל אפשר להעתיק <a href="http://www.binaryvision.org.il/wp-content/uploads/2010/01/dhcphack.pl_.txt">מכאן</a></p>
<p>הסקריפט מקבל 2 פרמטרים, הראשון הוא האיפי של הראוטר והשני זה קוד HTML שיכול להיות עד 63 תווים, אז תיהיו יצירתיים <img src='http://www.binaryvision.org.il/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . תדאגו גם לעטוף את הקוד HTML שאתם רוצים לנסות להזריק בגרשיים כדי שהטרמינל שלכם לא יחשוב שאלו פקודות BASH.</p>
<p>אחרי הניסיון ניצול (ידני או עם הסקריפט) תכנסו לממשק הווב לניהול הראוטר שלכם באמצעות הדפדפן ותבדקו אם הקוד שלכם הגיע לאחד הדפים &#8211; ואם כן, אז תכתבו לנו בתגובות בבקשה &#8211; תשתדלו לבדוק את הגרסא המדויקת של הראוטר שלכם לפני התגובה, ואם צריך להוסיף איזה קוד HTML כדי שההזרקה תיהיה אפקטיבית אז תדאגו להוסיף גם את זה.</p>
<p>יהיה מעניין לבדוק גם אם אפשר להריץ פקודות מרחוק, כמו הזרקת CGI SHELL לדפים של ראוטרים שונים. אבל אני מתאר לעצמי שזה בטח לא כלכך אפשרי.</p>
<p>התוצאות יתפרסמו בצורה מסודרת, כשיהיו מספיק תוצאות <img src='http://www.binaryvision.org.il/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
</div>]]></content:encoded>			<wfw:commentRss>http://www.binaryvision.org.il/?feed=rss2&amp;p=517</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>&#8235;המלצה על מוצר Firewall בייתי&#8236;</title>		<link>http://www.binaryvision.org.il/?p=509</link>
		<comments>http://www.binaryvision.org.il/?p=509#comments</comments>
		<pubDate>Wed, 20 Jan 2010 20:14:28 +0000</pubDate>
		<dc:creator>&#8235;PHANTOm&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[פריצה]]></category>
		<category><![CDATA[רשתות]]></category>

		<guid isPermaLink="false">http://www.binaryvision.org.il/?p=509</guid>
		<description><![CDATA[&#8235;
בעקבות המלצה על אתר בדיקות בלתי תלוי, החלטתי לעשות בדיקת ראש בראש בין 2 מוצרי Firewall בעצמי: ה- PC Tools Firewall Plus 6.0.0.88 וה- Comodo Internet Security 3.13. למי שאין כוח לקרוא את כל הטקסט, אל תשתמשו ב PC Tools.
&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><p>מזמן לא יצא לי לראות מה חדש בעולם תוכנות ה- Firewall,  אז כמה אנשים המליצו לי על <a title="Proactive Security Challenge" href="http://goo.gl/chNc" target="_blank">האתר הזה</a> שנראה די לגיטימי, יש להם מתודולוגיה, פרמטרים לבדיקה, וציונים. החלטתי לתת סיבוב ל- 2 המוצרים שקיבלו את הציונים הכי גבוהים ב Review שלהם.</p>
<p><a href="http://goo.gl/KE3z">PC Tools Firewall Plus 6.0.0.88</a> ו- <a href="http://goo.gl/SLhj">Comodo Internet Security 3.13</a>, שניהם מוצרים חינמיים אז אין בעיה להוריד ולבדוק. Online Armor Premium קיבל ציון 99% אבל הוא לא נתמך ב64 ביט, אז אין לי מה לבדוק אותו.</p>
<p>התחלתי מ <strong>PC Tools</strong>, הלוגו הזכיר לי מאיפה אני מכיר את החברה: הם עשו קופה בזמנו עם מוצרי ה Anti-Spyware, ותיקוני ה- Registry. אחרי שהתקנתי את המוצר הוא שאל אותי אם אני סומך על Google Talk ו mIRC, הסיבה שהוא התפל דווקא עליהם היא שהתוכנות לא חתומות, שזה סבבה כל עוד מי שרוצה לפרוץ אליך לא מוכן לבזבז 1000 דולר על חתימה. ניסיתי להריץ netcat ועוד כמה תוכנות אינטרנט לא חתומות, ולהפתעתי זה עבד. מוזר, אין שום שאלות מהתוכנה. ניסיתי להריץ shell של vnc connect back, גם עובד. מדאיג.</p>
<p>או קיי, אז אולי הוא ברמה של Windows Firewall חשבתי לעצמי, הוא בטח יקפוץ אם התוכנה תעשה listen ל 0.0.0.0, אבל מסתבר שממש לא. בניתי קוד חדש לבדיקה, לא חתום ולא כלום, דחפתי אותו בכוונה ל Startup ב Registry רק כדי לראות אולי PC Tools יבין את הרמז, אבל הרמז לא נקלט. כנראה שאני קורא את התוצאות הפוך, בטח באתר התכוונו ל- &quot;100%&quot; פריץ.</p>
<p>טוב, נמשיך עם <strong>Comodo</strong>, גם הוא קיבל ציון 100, וגם הוא חינמי.</p>
<p>ההתקנה שלו די גדולה, ומתחילה מ WinZip SFX, משהו שלא ראיתי משנת 1999 אז כשהסרט מאטריקס הראשון יצא. אחרי זה ההתקנה רצתה לדחוף לי 3 toolbars, ורצתה להחליף לי שרתי DNS.</p>
<p>אחרי ההתקנה, comodo התחיל לשאול שאלות, רובן מפגרות, כמו האם מותר לגעת לתהליך מערכת בג'יסטרי, בלי להגיד לי מה התהליך או מה ברג'יסטרי. אחרי משהו כמו 50 שאלות מתוכן 48 שבאמת לא היה צריך לשאול, הוא התחיל לעבוד. הוא בהחלט שם לב ל- VNC ולקוד שבניתי.</p>
<p>מה שפחות טוב, מסתבר שההמלצות ש- comodo נותן מבוססות על מה שאנשים אחרים לוחצים, למשל, התוכנה אמרה לי ש 95% מהאנשים שהריצו את הסוס הטרויאני חשבו שהתוכנה בטוחה. כמובן שמי שיודע לקבל החלטות כאלה בעצמו אכן הרוויח כלי די חזק לפחות מהכמה דקות שיצא לי לעבוד איתו.</p>
<p>לא יצא לי לבדוק שיטות מתקדמות על ה Firewall עדיין, אני אעדכן את הטקסט כשיצא לי. ראיתי גם עוד שמות של תוכנות מוכרות כמו Outpost ו Kaspersky שהיו לי בעבר, נכון לעכשיו ההמלצה שלי למי שמחפש משהו שייתן רמה סבירה של הגנה &#8211; שילך על <a title="Download Comodo Firewall" href="http://goo.gl/TGTf" target="_blank">Comodo</a>.</p>
</div>]]></content:encoded>			<wfw:commentRss>http://www.binaryvision.org.il/?feed=rss2&amp;p=509</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>&#8235;למה מתייחסים לSQL שונה?!&#8236;</title>		<link>http://www.binaryvision.org.il/?p=385</link>
		<comments>http://www.binaryvision.org.il/?p=385#comments</comments>
		<pubDate>Tue, 14 Jul 2009 03:33:56 +0000</pubDate>
		<dc:creator>&#8235;TAsn&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[אבטחה]]></category>
		<category><![CDATA[אתרים]]></category>
		<category><![CDATA[האקינג]]></category>
		<category><![CDATA[פריצה]]></category>

		<guid isPermaLink="false">http://www.binaryvision.org.il/?p=385</guid>
		<description><![CDATA[&#8235;
הקדמה קיימים הרבה מאוד סוגים של פרצות אבטחה, לדוגמא XSS, אני יכול להבין למה XSS קורה, הרי לפעמים יש מקרי קצה שבהם רוצים לתת למתכנת יכול לכתוב html, או לחלופין, קשה לבקר (לא באמת, אבל נניח) כל כתיבה שאנחנו מבצעים ולכן אפשר לפספס ובטעות לכתוב מחרוזת ששכחנו לעשות לה escaping. אותו דבר אני יכול להגיד [...]
&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><p><strong>הקדמה</strong><br />
קיימים הרבה מאוד סוגים של פרצות אבטחה, לדוגמא XSS, אני יכול להבין למה XSS קורה, הרי לפעמים יש מקרי קצה שבהם רוצים לתת למתכנת יכול לכתוב html, או לחלופין, קשה לבקר (לא באמת, אבל נניח) כל כתיבה שאנחנו מבצעים ולכן אפשר לפספס ובטעות לכתוב מחרוזת ששכחנו לעשות לה escaping.<br />
אותו דבר אני יכול להגיד על buffer overflow (גם לא באמת, אבל נניח) וישנן עוד הרבה פרצות שעליהן אפשר להגיד אותו דבר (לפעמים המצב עגום יותר ולפעמים פחות).<br />
אבל במקרה של sql injection אני פשוט לא מבין איך זה עדיין קיים. אבל לא על זה מדובר בכתבה, אלא על הבעיתיות והקלת הראש שאנשים מייחסים לשרת sql שלהם.</p>
<p><strong>תיאור הבעיה הנפוצה</strong><br />
כידוע Sql injection קורה כאשר המשתמש מצליח להשפיע על המחרוזת המכילה את השאילתא שאנחנו מריצים על ה db כך שהשאילתא תבצע פעולה שלא רצינו שתקרה.<br />
אוקיי, זו פרצה נחמדה, טריק מגניב, רעיון יפה, אבל למה זה עדיין קורה? הרי יש שתי פתרונות מאוד פשוטים למניעת הבעיה!</p>
<p><strong>פתרונות נפוצים</strong><br />
1. לעטוף את פונקציות אחזור המידע מהמשתמש, לדוגמא את הקריאה של ערכי ה get או ה post בפונקציית עזר שעושה escaping (כמובן שצריך טיפול שגם לוודא שמדובר במספר ולא בטקסט כאשר מעבירים פרמטר נומרי, אבל גם זה פתיר בצורה דומה) ולא לתת לאף מפתח באתר להשתמש בדרך השניה. האם זה באמת כ&quot;כ קשה? אני חושב שלא.</p>
<p>2. להשתמש בפונקציות מיוחדות בשפה (אם קיימות במקרה המדובר) אשר נותנות לעביר כפרמטרים את הנתונים שמתקבלים מהמשתמש וככה הבאג הזה בכלל לא קיים, כי מתייחסים לזה בתור אובייקט ולא מחרוזת משורשרת, לדוגמא sqlite ב python מאפשר את זה בקלות.</p>
<p>אז איך זה שאנשים עדיין לא עושים את זה? מעבר לבינתי.</p>
<p><strong>הבעיה האמיתית ופתרון בשבילה</strong><br />
הפתרונות שהצגתי כמובן נפוצים ומשתמשים בהם בכל מיני מקומות, והם הדרך לטיפול בבעיה, אבל לא מעט פעמים נתקלים בכל זאת בפרצות. אבל זה בהחלט לא מספיק!<br />
הבעיה האמיתית היא, איך בכלל הגענו למצב שבו כל מה שאנחנו צריכים זה לקרוא מידע מ&quot;טבלאת הידיעות של האתר&quot; ובכל זאת יש לנו הרשאות כתיבה\קריאה ל\מטבלאת המשתמשים?<br />
כל איש אבטחה יודע שהדבר הראשון שעושים זה &quot;הפרדת סמכויות&quot; כי בסופו של דבר, לא משנה כמה ה firewall שלך חוסם כל תעבורה וכל התוכנות שאתה משתמש בהן לא פגיעות, אם ל guest account שלך יש הרשאות root, יהיה לך גהנום בשרת <img src='http://www.binaryvision.org.il/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
בכל שרת sql בתחום יש שמות משתמש וססמאות, יתרה מכך, לכל שרת יש תמיכה באפשרויות הגבלת גישה מתקדמות.<br />
אז למה אנשים לא משתמשים ב user אחד בשביל לקרוא\לכתוב מהטבלאת משתמשים, ביוזר אחר בשביל לקרוא מידע וביוזר אחרון בשביל לכתוב מידע?  (כאשר מידע = הכל חוץ מטבלאות משתמשים) או אפילו אם צריך לפצל את זה עוד יותר (לדוגמא מידע אישי רגיש יהיה מפוצל מהבלוג של האתר).</p>
<p>ההנחה שלי היא: עצלנות.</p>
<p>אומנם הפתרון הזה לא ימנע sql injection אבל הוא בהחלט ימנע את גודל הנזק אם בכלל שיהיה אפשר לעשות עם הפרצה. הרי רוב ה&quot;שדות הפגיעים&quot; נמצאים ב headers של HTTP או שדות אחרים שנועדו לאחזור מידע, השדות של הססמה, שם משתמש או כתיבת מידע בד&quot;כ בטוחים. (אנשים שמים יותר דגש). בנוסף, נניח ומישהו מצא פגיעות בשדה אחד, זה גורר פגיעות רק בחלק הממודר הספציפי של האתר, ולא בחלק אחר שתחת יוזר sql אחר.לכן, כמו בכל תחום אחר באבטחת השרת שלכם, גם פה כדאי להשקיע קצת ולבחור חלוקת גישות בצורה חכמה.</p>
<p>אני מקווה שתפיקו לקחים ותיישמו, כי בסופו של דבר, זה השרת שלכם.</p>
<p><strong>הערה חשובה:</strong><br />
אני יודע שלא תמיד יש לכם גישה ליצירת גישות (לדוגמא שרת חינמי) אבל כל עוד אתם משלמים על השרת, זכותכם לדרוש כמה יוזרים שתרצו! ככה שזה לא תירוץ!!!</p>
<p><strong>הבהרה קטנה:</strong><br />
אמרו לי שלא הבהרתי מספיק טוב את עמדתי לגבי הנושא, אז הבהרה קטנה:<br />
אני לא חושב שבכלל צריך להגיע למצב שבו ליוזרים השונים ב DB יש משמעות אמיתי, כלומר, כמו שכתבתי בהקדה, אני לא רואה איף בכלל אפשר להגיע למצב העגום שבו יש לך SQL Injection בקוד, או בקיצור, תכתבו נכון ותכתבו בטוח ותחסכו לעצמכם בעיות. אבל תמיד טובה עוד שכבת הגנה <img src='http://www.binaryvision.org.il/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
</div>]]></content:encoded>			<wfw:commentRss>http://www.binaryvision.org.il/?feed=rss2&amp;p=385</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>&#8235;Linux Kernel Module, באגים ותיקונם&#8236;</title>		<link>http://www.binaryvision.org.il/?p=376</link>
		<comments>http://www.binaryvision.org.il/?p=376#comments</comments>
		<pubDate>Wed, 24 Jun 2009 21:06:19 +0000</pubDate>
		<dc:creator>&#8235;Fate&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[OpenMoko]]></category>
		<category><![CDATA[באג]]></category>

		<guid isPermaLink="false">http://www.binaryvision.org.il/?p=376</guid>
		<description><![CDATA[&#8235;
בהתעסקותי עם הOpenMoko שלי, גיליתי באג ממש מעצבן בKernel של לינוקס. או יותר נכון באחד מהמודולים שבאים איתו. הבאג הוא Null Dereference והנה הסיפור שלו. מתי זה קורה? יש לי מחשב Windows XP SP3 בבית, והוא מעודכן עם כל הפאטצ'ים של מיקרוסופט. באחד מן הימים אני מחבר את המכשיר (OpenMoko) עם כבל USB למחשב, ואני [...]
&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><p>בהתעסקותי עם הOpenMoko שלי, גיליתי באג ממש מעצבן בKernel של לינוקס.<br />
או יותר נכון באחד מהמודולים שבאים איתו.<br />
הבאג הוא Null Dereference והנה הסיפור שלו.</p>
<h2>מתי זה קורה?</h2>
<p>יש לי מחשב Windows XP SP3 בבית, והוא מעודכן עם כל הפאטצ'ים של מיקרוסופט.<br />
באחד מן הימים אני מחבר את המכשיר (OpenMoko) עם כבל USB למחשב, ואני רואה שבWindows לא קורה כלום.<br />
אבל המערכת הפעלה בפלאפון נתקעה, והוא מהבהב את המנורה שמסמנת Kernel Panic.</p>
<h2>מה לא ניסיתי?</h2>
<p>מיותר לציין שניסיתי לחפש על זה מידע באינטרנט, אבל כיוון שזה בעיה חדשה, שבאה בעקבות בעיה שהWindows חוטף Blue Screen במקרה דומה, אז כל התוצאות חיפוש זה המקרה ההוא, ואף מילה על Kernel Panic.<br />
אחרי דיונים ממושכים עם אנשים בFreenode שעונים פעם בשעה בערך, וגם אז קשה להביא אותם למצב שהם עוזרים איכשהו,<br />
הגעתי למסקנה שצריך את ההודעה של הKernel Panic כדי להבין מה הולך שם, וכדי שאנשים יוכלו לעזור לי יותר טוב.<br />
רק מה, המכשיר לא בדיוק מאפשר לך להתחבר אליו אחרי הPanic ולשאול אותו מה קרה, הדבר היחיד שאפשר לעשות זה לעשות Restart למכשיר ולאבד את ההודעה.<br />
מסתבר שמישהו כתב Patch לקרנל של לינוקס שמאפשר לשמור את ההודעות מערכת בRAM ואז בעליית המערכת פעם הבאה אפשר לבדוק את ההודעות שהיו.</p>
<h2>קימפול מחדש של הקרנל עם הPatch</h2>
<p>הPatch הוא של Lindi, וקוראים לו ramconsole.<br />
אז דבר ראשון שהייתי צריך זה להשיג את המקור של הKernel בגרסה המתאימה, ואת קובץ ההגדרות שיתאים למכשיר.<br />
את המקור ממש קל להשיג, את הקובץ הגדרות השגתי מהRepository של SHR (הפצה שמותקנת אצלי על הMoko)<br />
דבר שני צריך לשים את הPatch על הקוד מקור, ולוודא שכל החלקים שלו נרשמו בצורה תקינה.<br />
ודבר שלישי, צריך להשיג קומפילר שיקמפל לי למעבד ARM ולא X86, זה הבאתי מהOpenMoko ויקיפדיה שמכיל דף והורדה של הCrosstools שצריך כדי לקמפל דברים למכשיר.<br />
אחרי כל זה, יש לי קרנל, ויש לי מודולים שבאים איתו, ואני מעביר אותם למכשיר, ומתפלל&#8230;<br />
המכשיר עולה, הקרנל החדש עובד, נשרא לקמפל את הכלי ramconsole-dump(שגם הוא נכתב ע&quot;י lindi) כדי לראות את ההודעות,<br />
להעביר אותו למכשיר, לגרום לKernel Panic, ולראות את הפלט.</p>
<h2>מסתבר שזה לא הכל</h2>
<p>כדי לאתחל מחדש את המכשיר אחרי הKernel Panic, אני צריך להוציא סוללה ולהכניס חזרה.<br />
חבל מאד שהפעולה הזאת מוחקת את הRAM שצריך זרם כדי לשמור על המידע שלו.<br />
אחרי שיחה קצרה עם lindi מסתבר שאני צריך לאתחל את הקרנל עם פרמטרים נוספים:</p>
<pre>panic=10 mem=127M</pre>
<p>הראשון כדי שאחרי 10 שניות מהPanic הוא יעשה אתחול בעצמו, והשני כדי שהוא לא ישתמש בכל הזיכרון וידרוס את הRamconsole כשיעלה שוב.<br />
אז כדי להפעיל את הKernel עם פרמטרים אני צריך להחליף את הBootloader שעל המכשיר, כי כרגע הוא Qi, והוא לא מאפשר עריכת פרמטרים.<br />
אז אני מחליף את הBootloader בu-boot, ונכנס לקונסול שלו (לא פשוט, אבל אני לא אפרט) כדי לערוך את הפרמטרים.<br />
אחרי כל הסיפור, עולה הקרנל, אני מקפיא אותו, אחרי 10 שניות הוא עושה לעצמו Reboot, ואז אני מפעיל את ramconsole-dump לתוך קובץ.<br />
וזהו! יש לי את הdump, נשאר רק למצוא ולתקן את הבעיה. הנה השגיאה מי שרוצה לראות:</p>
<pre>
<6>[   44.390000] g_ether gadget: full speed config #2: RNDIS
<1>[   44.755000] Unable to handle kernel NULL pointer dereference at virtual address 00000000
<1>[   44.755000] pgd = c0004000
<1>[   44.755000] [00000000] *pgd=00000000
<4>[   44.755000] Internal error: Oops: 17 [#1] PREEMPT
<4>[   44.755000] Modules linked in: sco bnep snd_pcm_oss snd_mixer_oss ar6000 snd_soc_neo1973_gta02_wm8753 snd_soc_s3c24xx_i2s
   snd_soc_s3c24xx s3cmci btusb rfcomm ppp_generic slhc ohci_hcd ipv6 hidp l2cap bluetooth g_ether snd_soc_wm8753 snd_soc_core
   snd_pcm snd_timer snd_page_alloc snd
<4>[   44.755000] CPU: 0    Not tainted  (2.6.29-GTA02_fate-mokodev #2)
<4>[   44.755000] PC is at strlen+0x18/0x2c
<4>[   44.755000] LR is at gen_ndis_query_resp+0x574/0xc38 [g_ether]
<4>[   44.755000] pc : [<c01623f0>]    lr : [<bf05f708>]    psr: 60000093
<4>[   44.755000] sp : c0391cf8  ip : c0391d08  fp : c0391d04
<4>[   44.755000] r10: c655b3e0  r9 : 000001c0  r8 : c655b3f4
<4>[   44.755000] r7 : 00000000  r6 : c655b40c  r5 : 00000000  r4 : 00000000
<4>[   44.755000] r3 : bf0672b8  r2 : 00000000  r1 : 00000000  r0 : 00000000
<4>[   44.755000] Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
<4>[   44.755000] Control: c000717f  Table: 371ac000  DAC: 00000017
<4>[   44.755000] Process swapper (pid: 0, stack limit = 0xc0390268)
<4>[   44.755000] Stack: (0xc0391cf8 to 0xc0392000)
<4>[   44.755000] 1ce0:                                                       c0391d2c c0391d08
<4>[   44.755000] 1d00: bf05f708 c01623e8 c655b3f4 c7b77000 bf0672b8 c64e3aa0 00000000 00000004
<4>[   44.755000] 1d20: c0391d54 c0391d30 bf05fe48 bf05f1a4 c655b3e0 c09203e4 c0391d64 00000000
<4>[   44.755000] 1d40: c7b77000 0000004c c0391dec c0391d58 bf06002c bf05fddc c0391d84 c0391d68
<4>[   44.755000] 1d60: c0070cbc c0070200 c784d000 00000006 c674ca40 c03b5b14 c64e3aa8 c0391dc4
<4>[   44.755000] 1d80: c0391d98 c01e9d68 c01e808c c0367c68 c02d37b8 c03b5b14 00000000 c03934c8
<4>[   44.755000] 1da0: 00000000 00000000 00000000 0000000a c0391e04 c0391dc0 c006ed3c c006d3cc
<4>[   44.755000] 1dc0: c0391de4 c64e3aa8 c7b0be00 00000000 c64e3aa0 00000000 000001c0 00000004
<4>[   44.755000] 1de0: c0391e14 c0391df0 bf06075c bf05fea4 00000000 30025864 c0391e4c c64e3aa0
<4>[   44.755000] 1e00: c03b5b14 00000000 c0391e34 c0391e18 c01e7f2c bf060740 c08be5d4 00000001
<4>[   44.755000] 1e20: c08be5d4 00000000 c0391e74 c0391e38 c01e8dc0 c01e7ee0 00000001 00000000
<4>[   44.755000] 1e40: c03b5b14 c7b77000 c0390000 00000001 c03b5af0 00000000 c03b5b14 00000001
<4>[   44.755000] 1e60: 00000000 c64e3aa0 c0391eac c0391e78 c01e92f8 c01e8bd0 c02b3b14 c0070bb8
<4>[   44.755000] 1e80: 00000001 c03b5af0 00000000 00000001 00000000 00000000 00000000 c08be5d4
<4>[   44.755000] 1ea0: c0391ef4 c0391eb0 c01e977c c01e9194 00000000 00000001 c007026c 00000001
<4>[   44.755000] 1ec0: 00000000 40000093 00000000 c79bfa40 00000000 00000000 00000029 00000001
<4>[   44.755000] 1ee0: c0390000 30025864 c0391f14 c0391ef8 c007c3e4 c01e95ac c03a0360 00000029
<4>[   44.755000] 1f00: c79bfa40 c03a0394 c0391f34 c0391f18 c007df34 c007c3c8 00000029 00000000
<4>[   44.755000] 1f20: 02000000 00000002 c0391f4c c0391f38 c002a054 c007de20 ffffffff f4000000
<4>[   44.755000] 1f40: c0391fa4 c0391f50 c002a958 c002a010 00000001 00000032 f4100000 60000013
<4>[   44.755000] 1f60: c002c554 c0390000 c00282a8 c0395008 30025900 41129200 30025864 c0391fa4
<4>[   44.755000] 1f80: c0391f88 c0391f98 c002be20 c002c5a0 60000013 ffffffff c0391fbc c0391fa8
<4>[   44.755000] 1fa0: c002c344 c002c564 c08af150 c03bf744 c0391fcc c0391fc0 c02aeff0 c002c318
<4>[   44.755000] 1fc0: c0391ff4 c0391fd0 c0008ae0 c02aef98 c000858c 00000000 00000000 c0027ea4
<4>[   44.755000] 1fe0: c0007175 c03bfbec 00000000 c0391ff8 30008034 c00088e8 00000000 00000000
<4>[   44.755000] Backtrace:
<4>[   44.755000] [<c01623d8>] (strlen+0x0/0x2c) from [<bf05f708>] (gen_ndis_query_resp+0x574/0xc38 [g_ether])
<4>[   44.755000] [<bf05f194>] (gen_ndis_query_resp+0x0/0xc38 [g_ether]) from [<bf05fe48>] (rndis_query_response+0x7c/0xc8 [g_ether])
<4>[   44.755000] [<bf05fdcc>] (rndis_query_response+0x0/0xc8 [g_ether]) from [<bf06002c>] (rndis_msg_parser+0x198/0x3c8 [g_ether])
<4>[   44.755000]  r6:0000004c r5:c7b77000 r4:00000000
<4>[   44.755000] [<bf05fe94>] (rndis_msg_parser+0x0/0x3c8 [g_ether]) from [<bf06075c>] (rndis_command_complete+0x2c/0x70 [g_ether])
<4>[   44.755000] [<bf060730>] (rndis_command_complete+0x0/0x70 [g_ether]) from [<c01e7f2c>] (s3c2410_udc_done+0x5c/0x70)
<4>[   44.755000]  r6:00000000 r5:c03b5b14 r4:c64e3aa0
<4>[   44.755000] [<c01e7ed0>] (s3c2410_udc_done+0x0/0x70) from [<c01e8dc0>] (s3c2410_udc_read_fifo+0x200/0x274)
<4>[   44.755000]  r6:00000000 r5:c08be5d4 r4:00000001
<4>[   44.755000] [<c01e8bc0>] (s3c2410_udc_read_fifo+0x0/0x274) from [<c01e92f8>] (s3c2410_udc_handle_ep0+0x174/0x1c4)
<4>[   44.755000] [<c01e9184>] (s3c2410_udc_handle_ep0+0x0/0x1c4) from [<c01e977c>] (s3c2410_udc_irq+0x1e0/0x298)
<4>[   44.755000] [<c01e959c>] (s3c2410_udc_irq+0x0/0x298) from [<c007c3e4>] (handle_IRQ_event+0x2c/0x68)
<4>[   44.755000] [<c007c3b8>] (handle_IRQ_event+0x0/0x68) from [<c007df34>] (handle_edge_irq+0x124/0x174)
<4>[   44.755000]  r7:c03a0394 r6:c79bfa40 r5:00000029 r4:c03a0360
<4>[   44.755000] [<c007de10>] (handle_edge_irq+0x0/0x174) from [<c002a054>] (__exception_text_start+0x54/0x6c)
<4>[   44.755000]  r7:00000002 r6:02000000 r5:00000000 r4:00000029
<4>[   44.755000] [<c002a000>] (__exception_text_start+0x0/0x6c) from [<c002a958>] (__irq_svc+0x38/0xc8)
<4>[   44.755000] Exception stack(0xc0391f50 to 0xc0391f98)
<4>[   44.755000] 1f40:                                     00000001 00000032 f4100000 60000013
<4>[   44.755000] 1f60: c002c554 c0390000 c00282a8 c0395008 30025900 41129200 30025864 c0391fa4
<4>[   44.755000] 1f80: c0391f88 c0391f98 c002be20 c002c5a0 60000013 ffffffff
<4>[   44.755000]  r5:f4000000 r4:ffffffff
<4>[   44.755000] [<c002c554>] (default_idle+0x0/0x54) from [<c002c344>] (cpu_idle+0x3c/0x68)
<4>[   44.755000] [<c002c308>] (cpu_idle+0x0/0x68) from [<c02aeff0>] (rest_init+0x68/0x7c)
<4>[   44.755000]  r5:c03bf744 r4:c08af150
<4>[   44.755000] [<c02aef88>] (rest_init+0x0/0x7c) from [<c0008ae0>] (start_kernel+0x208/0x268)
<4>[   44.755000] [<c00088d8>] (start_kernel+0x0/0x268) from [<30008034>] (0x30008034)
<4>[   44.755000]  r5:c03bfbec r4:c0007175
<4>[   44.755000] Code: e24cb004 e1a02000 ea000000 e2800001 (e5d03000)
<0>[   44.760000] Kernel panic - not syncing: Fatal exception in interrupt
<0>[   44.765000] Rebooting in 10 seconds..arch_reset: attempting watchdog reset
</pre>
<h2>תיקון המודול בקרנל</h2>
<p>הCrash Dump ממש מדוייק, עד כדי הפונקצייה האחרונה שהורצה, ומאיזה קובץ.<br />
תודות לעזרה של TAsn ושל עוד בחור מFreenode, הם הצליחו למצוא את הבעיה בקוד של rndis.c.<br />
ומה שמסתבר שמי שכתב את זה הניח שאחד הפרמטרים לא יכול להיות Null, ועשה עליו strlen().<br />
מה שגרם לstrlen לעשות Null Dereference ולמות.<br />
התיקון היה להוסיף כמה שורות שממציאות שם לDevice, ומחיזרות את השם המומצא.</p>
<h2>התיקון</h2>
<pre>
--- a/drivers/usb/gadget/rndis.c
+++ b/drivers/usb/gadget/rndis.c
@@ -294,9 +294,14 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
 	/* mandatory */
 	case OID_GEN_VENDOR_DESCRIPTION:
 		pr_debug("%s: OID_GEN_VENDOR_DESCRIPTION\n", __func__);
+#if 0
 		length = strlen (rndis_per_dev_params [configNr].vendorDescr);
 		memcpy (outbuf,
 			rndis_per_dev_params [configNr].vendorDescr, length);
+#endif
+		const char vendorDescr[]="dummy";
+		length = strlen (vendorDescr);
+		memcpy (outbuf,	vendorDescr, length);
 		retval = 0;
 		break;
</pre>
<h2>לסיכום</h2>
<p>לאחר תיקון הבאג, הקרנל עובד, מתחבר לווינדווס מזדהה כמו שצריך כRNDIS Device,<br />
וכולם שמחים ומאושרים, או יותר נכון אני שמח ומאושר שאני יכול לחזור לעבוד על תוכנות במכשיר <img src='http://www.binaryvision.org.il/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>אתם מוזמנים להגיב ולשאול דברים אם תרצו&#8230;.</p>
</div>]]></content:encoded>			<wfw:commentRss>http://www.binaryvision.org.il/?feed=rss2&amp;p=376</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>&#8235;Reversing, והכוח של זה&#8236;</title>		<link>http://www.binaryvision.org.il/?p=252</link>
		<comments>http://www.binaryvision.org.il/?p=252#comments</comments>
		<pubDate>Wed, 08 Apr 2009 21:38:20 +0000</pubDate>
		<dc:creator>&#8235;Fate&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>
		<category><![CDATA[Firmware]]></category>
		<category><![CDATA[NAS]]></category>
		<category><![CDATA[Reversing]]></category>
		<category><![CDATA[אבטחה]]></category>
		<category><![CDATA[חומרה]]></category>
		<category><![CDATA[לינוקס]]></category>
		<category><![CDATA[פריצה]]></category>
		<category><![CDATA[רשתות]]></category>

		<guid isPermaLink="false">http://www.binaryvision.org.il/?p=252</guid>
		<description><![CDATA[&#8235;
בהמשך לפרק הקודם, היום אני הולך להראות לכם מה מצאתי במערכת הקבצים של הFirmware הבינארי שהורדתי מהאינטרנט. דבר ראשון נתחיל מהאתר וקבצי הASP שלו, שאני יכול לגלוש אליהם כמובן דרך ממשק הניהול. ממשק הWeb רשימת הקבצים שמצאתי נמצאת כאן בתמונה. דברים מעניינים שקופצים ישר לעין: x.asp נראה כאילו הוא אמור להציג סיסמה כלשהיא, ננסה להכנס [...]
&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><p>בהמשך לפרק הקודם, היום אני הולך להראות לכם מה מצאתי במערכת הקבצים של הFirmware הבינארי שהורדתי מהאינטרנט.<br />
דבר ראשון נתחיל מהאתר וקבצי הASP שלו, שאני יכול לגלוש אליהם כמובן דרך ממשק הניהול.</p>
<h2>ממשק הWeb</h2>
<div id="attachment_255" class="wp-caption alignleft" style="width: 160px"><a href="http://www.binaryvision.org.il/wp-content/uploads/2009/04/web_list.png"><img src="http://www.binaryvision.org.il/wp-content/uploads/2009/04/web_list-150x150.png" alt="רשימת קבצים" title="רשימת קבצים" width="150" height="150" class="size-thumbnail wp-image-255" /></a><p class="wp-caption-text">רשימת קבצים</p></div>
<p>רשימת הקבצים שמצאתי נמצאת כאן בתמונה.</p>
<p>דברים מעניינים שקופצים ישר לעין:</p>
<ul>
<li>x.asp
</li>
</ul>
<p>נראה כאילו הוא אמור להציג סיסמה כלשהיא, ננסה להכנס לדף ישירות דרך הנתב:<br />
<a href="http://192.168.2.1/x.asp">http://192.168.2.1/x.asp</a><br />
ומקבלים לא רק את הסיסמה שלי להתחברות לנתב, אלא גם את הסיסמה של איזשהו משתמש super.<br />
מה?! אתם בטח צוחקים עלי&#8230;.</p>
<div id="attachment_256" class="wp-caption alignleft" style="width: 160px"><a href="http://www.binaryvision.org.il/wp-content/uploads/2009/04/x_asp.png"><img src="http://www.binaryvision.org.il/wp-content/uploads/2009/04/x_asp-150x150.png" alt="x.asp" title="x.asp" width="150" height="150" class="size-thumbnail wp-image-256" /></a><p class="wp-caption-text">x.asp</p></div>
<p>ניסיתי להתחבר לממשק עם המשתמש super, והסיסמה שיש שם, אבל זה לא נתן לי להתחבר, צריך עוד לראות איפה משתמשים בזה.<br />
(ד&quot;א הסיסמה מצונזרת בכוונה)</p>
<ul>
<li>test.asp
</li>
</ul>
<p>לא נראה מעניין יתר מדי,<br />
נראה כמו חלק מהממשק הוספת שיתוף בNAS.</p>
<ul>
<li>users
</li>
</ul>
<p>קובץ שמכיל את הרשימה הבאה:</p>
<pre>
<pre class="brush: text">
 User1
 User2
 user3
 user4
 user5
 user6
 user7
 user8
 user9
</pre>
</pre>
<p>האל יודע למה, בינתיים לא מצאתי לזה שימוש או הגיון.</p>
<ul>
<li>flash.asp
</li>
</ul>
<p>נראה כאילו זה הדף שדרכו אחרי זה עושים flash לחומרה, לפחות כאן אני יכול לראות מה הגרסת Firmware שלי.<br />
שזה 2.15, קצת יותר ישן מהכי חדש שהורדתי מהאינטרנט (2.21), ז&quot;א לפני שאני משחק עם זה בהתבסס על 2.21 צריך לעדכן את הנתב שלי.</p>
<ul>
<li>getflash.asp
</li>
</ul>
<p>מביא קצת יותר פרטים, נותן את הMacים והRegulation Domain (מישהו יודע מה זה?)<br />
אצלי זה עומד על ETST 1-13(Europe)</p>
<ul>
<li>debug.asp
</li>
</ul>
<p>נראה ממש מעניין, מכיל טופס של פקודה command וכפתור apply.<br />
משחקים עם הטופס לא הניבו כלום, הוא כל פעם כותב Invalid value of command.<br />
מה שעוד יותר מוזר זה שאני לא רואה בסורס של debug.asp איפה כל הלוגיקה של מה שקורה אחרי שעושים Submit.<br />
מבדיקה של הטופס עולה כי הוא שולח את זה למקום לא ברור, וגם לא קיים פיזית:</p>
<pre>
<pre class="brush: html">
&lt;form action=/goform/formDebug method=POST name=&quot;debug&quot;&gt;
.
.
&lt;/form&gt;
</pre>
</pre>
<p>מה זה goform?? מאיפה זה בא?<br />
<a href="http://home.postech.ac.kr/~sion/cs499a/webserver/web/over/goforms.htm">http://home.postech.ac.kr/~sion/cs499a/webserver/web/over/goforms.htm</a><br />
מצוין, זה אומר שהטופס הזה מקומפל בתור קוד C לתוך השרת web שלנו.<br />
מצד אחד זה טוב, קוד C בדרך כלל לא כלכך אמין.<br />
מצד שני זה רע, אני אצטרך לעשות Reversing לשרת כדי לראות מה הולך מאחורי כל סקריפט.</p>
<h2>Reversing webs</h2>
<div id="attachment_266" class="wp-caption alignleft" style="width: 160px"><a href="http://www.binaryvision.org.il/wp-content/uploads/2009/04/formdebug.png"><img src="http://www.binaryvision.org.il/wp-content/uploads/2009/04/formdebug-150x150.png" alt="formDebug" title="formDebug" width="150" height="150" class="size-thumbnail wp-image-266" /></a><p class="wp-caption-text">formDebug</p></div>
<p>טוב, אז ניקח את הבינארי של השרת Web, ונראה מה אנחנו יכולים לשלוף ממנו.<br />
לפי מה שהבנתי מהתיעוד, כדי לרשום טופס חדש צריך לקרוא לwebFormDefine.<br />
בואו נראה אם אנחנו יכולים לראות מי קורא לזה ועם איזה פרמטרים.<br />
כמובן שזה מקומפל בלי Symbols, אז זה לא יהיה כזה פשוט, אפשר לנסות לגשת מצד אחר,<br />
כדי לרשום טופס צריך להביא את השם שלו בתור מחרוזת, ז&quot;א אם נוציא את השם של הטופס מתוך debug.asp<br />
אז נוכל למצוא את המקום בקוד שרושם אותו.<br />
השם של הטופס זה formDebug.<br />
מגיעים לפונקצייה שהוא רושם, מסמנים אותה כפוקנצייה שמטפלת בformDebug, ומסתכלים מה היא עושה.<br />
נראה כאילו הפונקצייה בודקת שהפקודה זה &quot;report.txt&quot;, ואז מייצרת לוג של הרבה מאד פקודות מערכת, ונותנת אותו להורדה.<br />
כמובן ה&quot;נראה כאילו&quot; לקח כמה זמן להבין, אני לא הולך להציג כאן את כל הקוד, זה פשוט הרבה אסמבלי.<br />
בכל מקרה בדיקה של התיאוריה מול הנתב באמת אישרה את זה, רשמתי בפקודה report.txt, וקיבלתי קובץ להורדה עם מלא מידע.<br />
כל ההגדרות רשת, ההגדרות נתב, כל המידע השותף שמשתנה בזמן הניהול, הוא זרק לי אותו בRaw Text.<br />
נקודה מעניינת שראיתי, שהוא קורא הרבה ל_system בקוד שלו.</p>
<h2>המשך עבודה</h2>
<ul>
<li>מה הוא עושה עם הסיסמא של super?
</li>
<li>למצוא עוד דברים מעניינים בממשק Web.
</li>
<li>למצוא קריאה ל_system שמקבלת מחרוזת שמורכבת מפרמטרים שאני מביא בקלט של הטפסים, כדי לאפשר לי הרצת פקודות ע&quot;י שרשור פקודות לינוקס לפרמטרים בממשק Web.
</li>
<li>מי שרוצה מוזמן להוריד את דפי הASP והבינארי של שרת הWEB מכאן: <a href="http://rapidshare.com/files/223290606/edimax_web_221.rar">http://rapidshare.com/files/223290606/edimax_web_221.rar</a>
</li>
</ul>
<p>אשמח לתגובות, רעיונות או כל דבר אחר שיש לכם להגיד&#8230;</p>
</div>]]></content:encoded>			<wfw:commentRss>http://www.binaryvision.org.il/?feed=rss2&amp;p=252</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>&#8235;Stack Format and Usage&#8236;</title>		<link>http://www.binaryvision.org.il/?page_id=48</link>
		<comments>http://www.binaryvision.org.il/?page_id=48#comments</comments>
		<pubDate>Tue, 23 Dec 2008 23:49:25 +0000</pubDate>
		<dc:creator>&#8235;Fate&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>

		<guid isPermaLink="false">http://www.binaryvision.org.il/?page_id=48</guid>
		<description><![CDATA[&#8235;
מבוא במעבדים ממשפחת 8086, שכרגע הם המעבדים הכי נפוצים במחשבים ביתיים, יש בכל Thread מחסנית שמשויכת אליו. מחסנית זה דף בזיכרון שמאולקץ ע&#34;י מערכת ההפעלה והשימוש בדף זיכרון זה מתבצע בצורה הבאה: כשמכניסים מידע למחסנית, המידע מוכנס מסוף דף הזיכרון, וגודל לכיוון תחילת הדף כשמוציאים מידע מהמחסנית, המחסנית קוטנת, וחוזרת חזרה לסוף דף הזיכרון שממנו [...]
&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><h2>מבוא</h2>
<p>במעבדים ממשפחת 8086, שכרגע הם המעבדים הכי נפוצים במחשבים ביתיים, יש בכל Thread מחסנית שמשויכת אליו.<br />
מחסנית זה דף בזיכרון שמאולקץ ע&quot;י מערכת ההפעלה והשימוש בדף זיכרון זה מתבצע בצורה הבאה:</p>
<ul>
<li>כשמכניסים מידע למחסנית, המידע מוכנס מסוף דף הזיכרון, וגודל לכיוון תחילת הדף
</li>
<li>כשמוציאים מידע מהמחסנית, המחסנית קוטנת, וחוזרת חזרה לסוף דף הזיכרון שממנו התחילו להכניס מידע.
</li>
</ul>
<p>לטיפול במחסנית יש כמה אוגרים במעבד לשימוש הקוד:</p>
<ul>
<li>SS &#8211; אוגר סגמנט שקובע באיזה דף יושבת המחסנית בזיכרון
</li>
<li>ESP &#8211; המקום אליו יכנס מידע חדש למחסנית, או יוצא מידע מהמחסנית
</li>
<li>EBP &#8211; אוגר שמשמש הרבה פיסות קוד בתור מצביע שני במחסנית לשימוש מתקדם
</li>
</ul>
<p>הפקודות הבסיסיות לשימוש המחסנית הם Push וPop.<br />
פקודות נוספות שמשתמשות במחסנית, משתמשות בפעולה של Push וPop.<br />
לדוגמה הפקודה Call:</p>
<pre>call MyFuncAddr
-
push EIP
jmp MyFuncAddr</pre>
<h2>הצורך במחסנית</h2>
<p>הצורך במחסנית נוצר כאשר רצו לשמור מידע שתקף לזמן ביצוע פונקצייה מסויימת,<br />
הצורך לשמור משתנים שהועברו לאותה פונקצייה, והצורך לחזור מכל לפונקצייה למקום שקראו לה ממנו.<br />
במחסנית הדבר מתאפשר ממש בקלות בגלל מבנה LIFO שמאפשר להוציא כל מה שנכנס לאחרונה,<br />
ז&quot;א פונקצייה שהולכת להתבצע מוסיפה את כל המידע שהיא צריכה למחסנית, וכשהיא מסתיימת אפשר להוציא את כל המידע שלה,<br />
כי היא האחרונה שהתבצעה..<br />
מה שמאפשר דברים כמו רקורסיה, שנותן לקרוא לאותה הפונקציה כמה פעמים שנרצה עם משתנים שונים כאילו זה פונקצייה שונה.<br />
דברים נוספים התווספו למחסנית כמו למשל טיפול בחריגים (Exception Handling)</p>
<h2>קונבצניות קריאה</h2>
<p>קונבנציות קריאה (Calling Convention) זה סטנדרט שהוגדר שמשתמשים בו כדי לקרוא לפונקצייה.<br />
יש כמה וכמה דרכים לקרוא לפונקצייה, הדרכים שונות בעיקר ב:</p>
<ul>
<li>סדר העברת הפרמטרים
</li>
<li>מקום איחסון הפרמטרים
</li>
<li>אחריות ניקוי הפרמטרים מהמחסנית
</li>
</ul>
<p>הסעיפים הבאים מדגימים איך תראה קריאה לפונקצייה באסמבלי בכל אחת מהקונבנציות הנפוצות.</p>
<pre>
<pre class="brush: c">int func(int a,int b,int c)
{
 return 0;
}</pre>
</pre>
<h3>cdecl</h3>
<ul>
<li>סדר העברת פרמטרים מימין לשמאל (סדר הפוך)
</li>
<li>איחסון פרמטרים במחסנית
</li>
<li>אחריות ניקוי על הקורא
</li>
</ul>
<pre>push c
push b
push a
call func
add esp,12</pre>
<h3>stdcall</h3>
<p>הקונבנציה הסטנדרטית של WIN32API</p>
<ul>
<li>סדר העברת פרמטרים מימין לשמאל (סדר הפוך)
</li>
<li>איחסון פרמטרים במחסנית
</li>
<li>אחריות ניקוי על הנקרא
</li>
</ul>
<pre>push c
push b
push a
call func</pre>
<h3>fastcall</h3>
<p>קונבנציה לקריאה מהירה, אין סטנדרט אחיד, בדרך כלל זה תלוי בקומפילר.</p>
<ul>
<li>הפרמטרים הראשונים (שמאל לימין) בECX ואחריו בEDX, והשאר במחסנית נדחפים מימין לשמאל (סדר הפוך)
</li>
<li>איחסון פרמטרים גם באוגרים וגם במחסנית
</li>
<li>אחריות ניקוי על הנקרא
</li>
</ul>
<pre>mov ecx,a
mov edx,b
push c
call func</pre>
<h2>מסגרת מחסנית</h2>
<p>מסגרת מחסנית (Stack Frame) זה קונספט שפיתחו לשימוש נוח יותר במשתנים ופרמטרים בתוך פונקצייה בזמן הריצה שלה.<br />
הקונספט משתמש בEBP כדי להצביע למקום קבוע במחסנית, כך שניתן יהיה בצורה מדוייקית וקלה לגשת למשתנים מקומיים ולפרמטרים של הפונקצייה כאשר ניגשים לזיכרון יחסית לEBP.</p>
<p>ניקח לדוגמה את הפונקציה הבאה:</p>
<pre>
<pre class="brush: c">int func(int a,int b)
{
 int d;
 d = a + b;
 return d;
}</pre>
</pre>
<p>פונקצייה זו לא עושה הרבה, מחשבת סכום במשתנה מקומי, ומחזירה אותו.<br />
נשתמש בקונבנציית קריאה stdcall, וכך בערך זה יראה באסמבלי, כולל הStack Frame.</p>
<pre>func:
push ebp
mov ebp,esp
sub esp,4
mov eax, [ebp + 0ch]
add eax, [ebp + 8]
mov [ebp - 4], eax
mov esp,ebp
pop ebp
retn 8</pre>
<p>הסבר שורות:</p>
<ul>
<li>דוחפים את EBP כדי שהשימוש שלנו בו לא יהרוס את הStack Frame של הפונקצייה שקראה לנו
</li>
<li>מעבירים לEBP את המצביע מחסנית הנוכחי בשביל המסגרת החדשה
</li>
<li>מזיזים את מצביע המחסנית ב4 יותר גבוה כדי להשאיר מקום למשתנה מקומי d
</li>
<li>מכניסים לאוגר זמני את הערך של פרמטר a (סדר הפוך של פרמטרים) (EBP + 0ch)
</li>
<li>מוסיפים לאוגר את הערך של b
</li>
<li>שומרים את הערך במשתנה d המקומי (EBP &#8211; 4)
</li>
<li>מחזירים את המצביע של ESP למצב שהיה לפני שהוספנו משתנים מקומיים
</li>
<li>משחזרים את הEBP המקורי
</li>
<li>יוצאים מהפונקצייה ומנקים אחרינו 2 פרמטרים (8 בתים)
</li>
</ul>
<p>מצב המחסנית בזמן ביצוע הפעולה add: (המחסנית גודלת כלפי מעלה)</p>
<pre>[EBP-4] - Variable D
[EBP]   - Old EBP
[EBP+4] - Return Address
[EBP+8] - Parameter A
[EBP+C] - Parameter B</pre>
<h2>שימושים נוספים</h2>
<h3>SEH</h3>
<p>למחסנית יש שימושים נוספים חוץ משמירת משתנים ומסגרות.</p>
<p>שימוש נפוץ נוסף זה Structured Exception Handling או SEH.</p>
<p>כאשר במערכת ההפעלה קופץ Exception, או בגלל טעות של התוכנה, או בגלל שככה התוכנה מנהלת את השגיאות שלה.</p>
<p>נקרא קוד שאמור לטפל בשגיאה הזאת, אם הקוד לא מודיע שהוא טיפל בשגיאה, מעלים את השגיאה לקוד המטפל שבא לפניו.</p>
<ul>
<li>לפרטים נוספים: <a href="">Structured Exception Handling</a>
</li>
</ul>
<h2>סיכום</h2>
<ul>
<li>המחסנית היא חלק חשוב מאד בריצה של קוד.
</li>
<li>ניתן לקמפל קוד ללא מחסנית, אבל זה לא פשוטף וברוב המקרים פשוט יממש מחסנית בעצמו
</li>
<li>שיטת שימוש המחסנית, ושימושים נוספים בה תלוי בקומפילר
</li>
<li>במחסנית מכילה לא רק נתונים אלא גם בקרה (כתובת חזרה, SEH, וכו') מה שיכול לגרום לבעיות אבטחה בקוד
</li>
</ul>
</div>]]></content:encoded>			<wfw:commentRss>http://www.binaryvision.org.il/?feed=rss2&amp;page_id=48</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
