翻蚳è ãã
ãã®ç 究ã§ã¯ãèè ã¯ããŒãã¡ã¢ãªãªãŒããŒãããŒãæªçšããèå³æ·±ãææ³ãæããã«ããŠããŸãã ãã¡ããããã®è匱æ§ã¯ããªãåã«ä¿®æ£ãããŠããŸãããææ³èªäœã¯éåžžã«èå³æ·±ããã®ã§ããããªãŒããŒãããŒããã»ã¹ã¯éåžžã«è©³çŽ°ã§ãã
æ å ±ã»ãã¥ãªãã£ã«èå³ãããããªãŒããŒãããŒãã©ã®ããã«çºçããããç解ãããå Žåã¯ããããçŸåšããã³ãã®åŸã®ãã¥ãŒã¹éå ±ã«è¡šç€ºãããã®ã§ããã®èª¿æ»ãæ°ã«å ¥ã£ãŠããã ããããšã§ãããã
ãŸããã
ãã®èšäºã§ã¯ãæ°ããããŒããªãŒããŒãããŒã®æªçšæ¹æ³ïŒããŒã
ãªãŒããŒãããŒïŒJavaScriptã€ã³ã¿ãŒããªã¿ãŒã èŠããã«ãããŒããååŸããã«ã¯
ãªãŒããŒãããŒã®å ŽåãJavaScriptã³ãã³ãã䜿çšããŠããããã¡ãŒãªãŒããŒãããŒã®çŽåŸã«ä¿¡é Œã§ããé¢æ°ãã€ã³ã¿ãŒã®è¡šç€ºãæäŸã§ããŸãã ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãèè ãCanSecWest 2008 Pwn2Ownã³ã³ãã¹ãã§åªåããããã«äœ¿çšããSafariãã¯ããã¯ã䜿çšããŸãã
ã¯ããã«
å€ãã®ãããã¡ããã³æŽæ°ãªãŒããŒãããŒã®è匱æ§ã«ãããããŒããã€ã³ã¿ãžã®çžå¯Ÿãªãã»ããã§è€æ°ã®ä»»æã®å€ãæžã蟌ãããšãã§ããŸãã æ»æè ã«ãšã£ãŠæ®å¿µãªããšã«ãå€ãã®å Žåããã€ã³ã¿ã«ç¶ãããŒã¿ã¯äºæž¬äžèœã§ãããæäœãå°é£ã§ä¿¡é Œæ§ãäœããªããŸãã å®å šãªããŒããªãŒããŒãããŒã«ãããæ»æè ã¯ãªãŒããŒãããŒãããã€ãã®æ°ãšå€ãå®å šã«å¶åŸ¡ã§ããããã«ãªããŸãããŸããæžãæããé¢çœãäºæž¬å¯èœãªãã®ããªãå Žåãããã¯å®éã«ã¯äžå¯èœã§ãã
ã¡ã¿ããŒã¿æ§é ã®å®å šãªãªãªãŒã¹ã®ãããã§ãããŒãã¯ãªãŒããŒãããŒã®èå³æ·±ã察象ã§ã¯ãªããªãã€ã€ãããŸãã çŸåšããªãŒããŒãããŒããŒã¿ã«ã¯ãéåžžã®ããã°ã©ã ã®å®è¡ãæ»æè ã®ã³ãŒããžã®ãã€ã³ã¿ãŒã§äžæžããããé¢æ°ãã€ã³ã¿ãŒã«ã€ãªãããããªããŒã¿ãå¿ èŠã§ãã ãã ãããã®ãããªæäœã¯ä¿¡é Œæ§ãä¿èšŒãããã®ã§ã¯ãããŸããã ãªãŒããŒãããŒãæåãããã«ã¯ããããã¡ãªãŒããŒãããŒåŸããŸã å©çšã§ããªããã€ã³ã¿ãŒãããŒãå ã«ããå¿ èŠãããããããã®éã«ä»ã®éèŠãªããŒã¿ãããŒã¯ãããŠããªãã¡ã¢ãªããã£ãŠã¯ãªããŸããã ãã®ãããªçæ³çãªæ¡ä»¶ã¯ãã©ã®ã¢ããªã±ãŒã·ã§ã³ã§ã確ãã«ãŸãã§ãã
ãã ããJavaScriptãªã©ã®ã¯ã©ã€ã¢ã³ãåŽã®ã¹ã¯ãªããèšèªã¢ã¯ã»ã¹ãäžããããå Žåãæ»æè ã¯Webãã©ãŠã¶ãŒãªã©ã®ã¢ããªã±ãŒã·ã§ã³ã®è匱æ§ã«å¯Ÿãããããã®çæ³çãªæ¡ä»¶ãäœæããå¯èœæ§ããããŸãã èšäºïŒSotirovãA. Heap Feng Shui in JavaScriptãBlackhat Europe 2007ïŒã§ãSotirovã¯Internet Explorerã§JavaScriptãã£ã¹ããªãã¥ãŒã·ã§ã³ã䜿çšããŠæ»æè ãã¿ãŒã²ããããŒããå¶åŸ¡ããæ¹æ³ã説æããŠããŸãã ãã®èšäºã§ã¯ã圌ã®äžé£ã®é¢šæ°ŽïŒããŒã颚氎ïŒã«è§Šçºãããæ°ããææ³ã«ã€ããŠèª¬æããŸãã
2ãã¯ããã¯
2.1ã³ã³ããã¹ã
åºçŸ©ã«ã¯ããã®æ¹æ³ã䜿çšããŠãJavaScriptã䜿çšããWebãã©ãŠã¶ãŒã«å¯Ÿããã¯ã©ã€ã¢ã³ããšã¯ã¹ããã€ããéçºã§ããŸãã ãã®ã³ã³ããã¹ãã§ã¯ãæ»æè ã¯ïŒç¹ã«ïŒJavaScriptã³ãã³ããå«ãWebããŒãžãäœæãã被害è ã«ãã©ãŠã¶ã§ããŒãžãããŒããããŸãã æ»æè ã¯ãç¹å®ã®JavaScriptã³ãã³ãã䜿çšããŠãæ»æã®æåãçµç¹åããããã«ã被害è ã®ãã©ãŠã¶ãŒããã»ã¹ã®ããŒãã®ç¶æ ã«åœ±é¿ãäžããŸãã
å°æ¥ãæºæ¯ã®ãããã¡ã¯è匱ãªãããã¡ã§ããããšã«çæããŠãã ããã ããŒããªãŒããŒãããŒãå®çŸããã«ã¯ãè匱ãªãããã¡ãŒã®é 眮ãšãªãŒããŒãããŒãJavaScriptã€ã³ã¿ãŒããªã¿ãŒã§å®è¡ããå¿ èŠããããŸãã ç¹ã«ãJavaScriptã€ã³ã¿ãŒããªã¿ãŒãäœæãããåã«è匱ãªãããã¡ãŒãæ¢ã«å²ãåœãŠãããŠããç¶æ³ã§ã¯ããã®ã¡ãœããã¯äœ¿çšãããŸããã
ãŸããã·ã§ã«ã³ãŒããå©çšå¯èœã§ããããããã¡ã¢ãªã«ããŒãããã¡ã«ããºã ããã§ã«èŠã€ãã£ãŠãããšæ³å®ããŠããŸãã ããã¯JavaScriptã§ã¯ç°¡åã§ãã倧ããªè¡ã«ããŒãããã ãã§ãã
2.2æŠèŠ
ç®æšã¯ãè匱ãªãããã¡ã®çŽåŸã«ããŒãäžã®ãããã¡ã管çããããšã§ãã ããã¯ããã¹ãŠã®ç©Žãè匱ãªãããã¡ãŒãä¿æããã®ã«ååãªå€§ããã§ããã管çãããããã¡ãŒã«å²ãŸããŠããããŒããç·šæããããšã§å®çŸããŸãã
ãã®ææ³ã¯5ã€ã®æ®µéã§æ§æãããŠããŸãã
1.ããŒããæé©åããŸãã
2.ããŒãã«ç©ŽãäœæããŸãã
3.ç©Žã®åšãã«ãããã¯ãæºåããŸãã
4.ããªã¬ãŒã®åé¢ãšãªãŒããŒãããŒã
5.ã·ã§ã«ã³ãŒããžã®ç§»è¡ãéå§ããŸãã
ãããã®æé ã«ã€ããŠã¯ããã®ã»ã¯ã·ã§ã³ã®æ®ãã®éšåã§è©³ãã説æããŸãã
2.3ããã©ã°
ããã»ã¹ããŒãã®ç¶æ ã¯ãããã»ã¹ã®æå¹æéäžã«çºçããã¡ã¢ãªã®å²ãåœãŠãšè§£æŸã®å±¥æŽã«ãã£ãŠç°ãªããŸãã ãã®ãããé£ç¶çãªãã«ãã¹ã¬ããããã»ã¹ïŒWebãã©ãŠã¶ãªã©ïŒã®ããŒãç¶æ ã¯äºæž¬ã§ããŸããã ååãšããŠããã®ãããªããŒãã¯ã空ãã¡ã¢ãªã«å€ãã®ç©ºãããããšããäºå®ã«ãã£ãŠæçåãããŸãã 空ãã¡ã¢ãªã®ãµã€ãºãç°ãªãããŒã«ãååšãããšããããšã¯ãåããµã€ãºã®ãããã¡ã®é£ç¶ããååžã®ã¢ãã¬ã¹ãä¿¡é Œã§ããé¢ä¿ãæã€å¯èœæ§ãäœãããšãæå³ããŸãã å³1ã¯ãæçåãããããŒãå ã§ã®ååžã®æ§åã瀺ããŠããŸãã
å³1.æçåãããããŒãã
ãã°ãã䜿çšãããŠããããŒãå ã§ãããã®ããŒã«ãçºçããå¯èœæ§ãããå Žæãäºæž¬ããããšã¯äžå¯èœã§ããããã次ã®ååžãçºçããå Žæãäºæž¬ããããšã¯äžå¯èœã§ãã
ãã ããã¿ãŒã²ããã¢ããªã±ãŒã·ã§ã³ãããçšåºŠå¶åŸ¡ã§ããå Žåã¯ãä»»æã®ãµã€ãºã®å€ãã®ååžãã¢ããªã±ãŒã·ã§ã³ã«åŒ·å¶ããããšãã§ããŸãã ç¹ã«ãæ¬è³ªçã«ãã¹ãŠã®ç©Žãåããå€ãã®ååžãäœæã§ããŸãã ç©Žããã£ã±ãã«ãªããšãã€ãŸãããŒããæé©åããããšããã«ãå³2ã®ããã«ãéåžžãåæ§ã®ãµã€ãºã®ååžã¯äºæž¬ã©ããã«äºãã«è¿ããªããŸãã
å³2.æé©åãããããŒãã å°æ¥ã®äºç®é åã¯é£ç¶ããŠããããšãå€æããŸããã
ããã©ã°ã¯åžžã«ç¹å®ã®ãããã¡ãµã€ãºãæãããšã匷調ããŸãã è匱æ§ãå©çšããæºåãšããŠãè匱ãªãããã¡ã®ãµã€ãºã«é¢ããŠããŒããæé©åããå¿ èŠããããŸãã ãã®ãããã¡ã®ãµã€ãºã¯ããŸããŸã§ãããæ¢ç¥ã§ããå¿ èŠããããŸãã å³2ã«ç€ºãããã«ãJavaScriptã§ã®æé©åã®èšå®ã¯éåžžã«ç°¡åã§ãã
äŸïŒ
var bigdummy = new Array(1000); for(i=0; i<1000; i++){ bigdummy[i] = new Array(size); }
äžèšã®ã³ãŒãã¹ããããã§ã¯ãæ°ããé åïŒãµã€ãºïŒãåŒã³åºããã³ã«ãããŒãã«4 *ãµã€ãº+ 8ãã€ããå²ãåœãŠãããŸãã ãã®ååžã¯ã8ãã€ãã®ããããŒãšããã«ç¶ããµã€ãºãã€ã³ã¿ãŒã®é åã§æ§æãããArrayStorageãªããžã§ã¯ãã«å¯Ÿå¿ããŸãã æåã¯ããã¹ãŠã®ååžããŒãã«ãªã»ãããããŸãã ãµã€ãºã¯ãçµæã®ååžãã§ããã ããµã€ãºã«è¿ããè匱ãªãããã¡ã®ãµã€ãºä»¥äžã«ãªãããã«éžæããå¿ èŠããããŸãã äžèšã®å€1000ã¯çµéšçã«æ±ºå®ãããŸããã
2.4ç©Žãéãã
ç§ãã¡ã®ç®æšã¯ãè匱ãªãããã¡ãŒã«ç¶ããããã¡ãŒãå¶åŸ¡ããããšã§ãã æé©åãæ©èœãããšä»®å®ãããšãããŒãã®æåŸã«ãè匱ãªãããã¡ãŒïŒãŸã å²ãåœãŠãããŠããªãïŒãšã»ãŒåããµã€ãºã®ããã€ãã®é£æ¥ãããããã¡ãŒãå¿ èŠã§ãïŒå³3ïŒã
å³3.å€ãã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã§ã®æé©åãããããŒã å¶åŸ¡ããŠããåããµã€ãºã®ãããã¡ãŒã®é·ãè¡ã衚瀺ãããŸãã
次ã®ã¹ãããã¯ããããã®é£æ¥ãããããã¡ã®æ®ããã¹ãŠã解æŸããè匱ãªãããã¡ã®ãµã€ãºã«äžèŽãã代æ¿ã®ãããã¡ãšããŒã«ãæ®ãããšã§ãã
ãããéæããããã®æåã®ã¹ãããã¯ã次ã®ã³ãŒãã§ãã
for (i=900; i<1000; i+=2){ delete(bigdummy[i]); }
forã«ãŒãã®äžéã¯ãããã©ã°æ®µéã§900åã®é åžãè¡ãããåŸãããŒãã®æåŸã§åŸç¶ã®ãã¹ãŠã®é åžãé£ç¶ããŠçºçãããšããä»®å®ã«åºã¥ããŠããŸãã
æ®å¿µãªããããã®æ®µéã§ã¯åé¡ããããŸãã JavaScriptã§ãªããžã§ã¯ããåé€ããã ãã§ã¯ãããã«ããŒãäžã®ãªããžã§ã¯ãã¹ããŒã¹ã解æŸãããããã§ã¯ãããŸããã ããŒãå ã®ã¹ããŒã¹ã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãçºçãããŸã§ã¯ãªã¢ãããŸããã Internet Explorerã¯CollectGarbageïŒïŒã¡ãœãããæäŸããŸãããã®ã¡ãœããã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããã«éå§ããŸãããä»ã®ãã©ãŠã¶ãŒå®è£ ã¯ããã§ã¯ãããŸããã ç¹ã«ãWebKitã¯ãµããŒãããŠããŸããã ãã®ãããWebKitã§ã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®èª¬æã«ç§»ããŸãã
WebKitãœãŒã¹ã³ãŒãã®ã¬ãã¥ãŒã§ã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããªã¬ãŒã§ããäž»ãªã€ãã³ãã3ã€ããããšã瀺ãããŸããã ãããã®ã€ãã³ããç解ããã«ã¯ãWebKitã®JavaScriptã³ãŒãããªããžã§ã¯ããæäœããæ¹æ³ã«ç²ŸéããŠããå¿ èŠããããŸãã
å®è£ ã¯ãprimaryHeapãšnumberHeapã®2ã€ã®æ§é ããµããŒãããŸããåæ§é ã¯ãCollectorBlockãªããžã§ã¯ããžã®ãã€ã³ã¿ãŒã®é åã§ãã CollectorBlockã¯åºå®ãµã€ãºã®ã»ã«ã®é åã§ãããåã»ã«ã«ã¯JSCellãªããžã§ã¯ãïŒãŸãã¯æŽŸçïŒãå«ããããšãã§ããŸãã åJavaScriptãªããžã§ã¯ãã¯ããããã®ããŒãã®ããããã®ã»ã«ãå æããŸãã ã©ãŒãžãªããžã§ã¯ãïŒé åãæååãªã©ïŒã¯ãã·ã¹ãã ããŒãã®è¿œå ã¡ã¢ãªãå æããŸãã ãã®è¿œå ã®ã·ã¹ãã ã¡ã¢ãªããªã³ã¯ã¹ãã¬ãŒãžãšåŒã³ãŸãã
åCollectorBlockã¯ãããªãŒã»ã«ã®ãªã³ã¯ãªã¹ããä¿æããŸãã éžæãèŠæ±ãããæ¢åã®CollectorBlocksã«ç©ºãã»ã«ããªãå Žåãæ°ããCollectorBlockãå²ãåœãŠãããŸãã
JSObjectããååŸãããã¹ãŠã®JavaScriptãªããžã§ã¯ãã¯ãprimaryHeapã«å²ãåœãŠãããŸãã numberHeapã¯ãNumberImpãªããžã§ã¯ãçšã«äºçŽãããŠããŸãã åŸè ã¯JavaScriptã®Numberãªããžã§ã¯ãã«å¯Ÿå¿ããŠããŸããããååãšããŠããããã¯äžéç®è¡èšç®ã«å¯Ÿå¿ããç絡ãªããžã§ã¯ãã§ãã
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãéå§ããããšãäž¡æ¹ã®ããŒãã®åç §ããŒãã®ãªããžã§ã¯ãããã§ãã¯ããããã®ãããªãªããžã§ã¯ãïŒããã³é¢é£ããã¹ãã¬ãŒãžãããå ŽåïŒã解æŸãããŸãã
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããªã¬ãŒãã3ã€ã®ã€ãã³ãã«æ»ããŸãã
1.å°çšã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¿ã€ããŒã®æå¹æéã
2.ããŒãã®åã ã®CollectorBlockããã¹ãŠãã£ã±ãã«ãªã£ããšãã«çºçããé åžèŠæ±ã
3.ååã«å€§ããé¢é£ãªããžããªãŒãæã€ãªããžã§ã¯ãïŒãŸãã¯ããã€ãã®ãã®ãããªãªããžã§ã¯ãïŒãéžæããŸãã
ãããã®ã€ãã³ãã®æåã¯ããŸãæçšã§ã¯ãããŸããããªããªã JavaScriptã«ã¯ã¹ã¿ã³ãã€ã¢ãŒãããããŸããããŸããã¹ã¯ãªããã®é¡èãªé 延ã«ããã[é ãã¹ã¯ãªãã]ãã€ã¢ãã°ããã¯ã¹ã衚瀺ãããå ŽåããããŸãã
ãããã®ã€ãã³ãã®æåŸã¯ãprimaryHeapå ã®ãªããžã§ã¯ãã®æ°ãšãé¢é£ããã¹ãã¬ãŒãžã®ãµã€ãºã«äŸåããŸãã å®éšã§ã¯ãprimaryHeapã®ç¶æ ã¯ããã©ãŠã¶ãŒã§éããŠããWebããŒãžã®æ°ãšããããã®ããŒãžãJavaScriptã䜿çšããçšåºŠã«å¿ããŠå€§ããç°ãªãããšã瀺ãããŠããŸãã ãããã£ãŠããã®ã€ãã³ãã§ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã確å®ã«éå§ããããšã¯å°é£ã§ãã
äžæ¹ãnumberHeapã¯ãããã®å€æŽã«å¯ŸããŠæ¯èŒçéæãªããã§ãã 調æ»ã«ãããšãnumberHeapã¯ãJavaScriptã䜿çšããéèŠãªããŒãžãã¥ãŒã§ãã1ã€ã®å°çšCollectorBlockã®ã¿ããµããŒãããŠããŸãã numberHeap CollectorBlockã«ã¯4062åã®ã»ã«ããããããå€æ°ã®NumberImpãäœæããJavaScriptã³ãŒãïŒäžéèšç®ã䜿çšããŠå€æ°ã®ç®è¡æŒç®ãå®è¡ïŒãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãéå§ããå¿ èŠããããŸãã äŸãšããŠãdoubleã®æäœã¯numberHeapããNumberImpã®å²ãåœãŠã«ã€ãªããæäœã§ããããã次ã®JavaScriptã³ãŒãã䜿çšããŠã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãéå§ã§ããŸãã
for (i=0; i<4100; i++) { a = .5; }
ãã®ã³ãŒããå®äºãããšãããŒãã¯å³4ã®ããã«ãªãã次ã®ã¹ãããã®æºåãæŽããŸãã
å³4.ãã¹ãŠã®ãããã¡ãŒã解æŸããã管çããŒã è匱ãªãããã¡ã®å²ãåœãŠã¯ãç©Žã®1ã€ã§çµäºããŸãã
2.5ãããã¯ã®æºåã
ãã®æé ã¯ç°¡åã§ãã 次ã®JavaScriptã䜿çšããŸãã
for (i=901; i<1000; i+=2) { bigdummy[i][0] = new Number(i); }
ã³ãŒãbigdummy [i] [0] = new NumberïŒiïŒã¯ãæ°ããNumberInstanceãªããžã§ã¯ããäœæããbigdummy [i]ã«å¯Ÿå¿ããArrayStorageãªããžã§ã¯ãã«ãã®ãªããžã§ã¯ããžã®ãã€ã³ã¿ãŒãæ ŒçŽããŸãã å³5ã¯ãJavaScriptãå®è¡ããåŸã®ããŒãã®äžéšã瀺ããŠããŸãã
å³5.ãªãŒããŒãããŒãå§ãŸãçŽåã®æ»æè ãå¶åŸ¡ãããããã¯ã®è©³çŽ°ã
2.6ã åé åžãšãªãŒããŒãããŒãéå§ããŸãã
ããã§ãè匱ãªãããã¡ãå²ãåœãŠãŸãã åã®æé ãæ£åžžã«çµäºããå Žåãè匱ãªãããã¡ã®é åžã¯äœæããç©Žã®1ã€ã«ããããªãŒããŒãããŒã®æºåãã§ããŠããŸãã ãªãŒããŒãããŒãªããžã§ã¯ãã¯ãè匱ãªãããã¡ãŒã«ç¶ãArrayStorageãªããžã§ã¯ãã®pNIãã€ã³ã¿ãŒãäžæžãããããšã§ãã æ°ããå€ã¯ãã·ã§ã«ã³ãŒãã®ã¹ã¬ããã®ã¢ãã¬ã¹ã§ããå¿ èŠããããŸãã ã¹ã¬ããã®è©³çŽ°ã«ã€ããŠã¯åŸè¿°ããŸãããçŸæç¹ã§ã¯ãå žåçãªã¹ã¬ããNOPïŒhttps://en.wikipedia.org/wiki/NOP_slideïŒã¯ããã§ã¯é©åã§ã¯ãªãããšã«æ³šæããŠãã ããã 匷調衚瀺ããŠãªãŒããŒãããŒãããšãããŒãã¯å³6ã®ããã«ãªããŸãã
å³6.ãªãŒããŒãããŒãéå§ãããçŽåŸã«æ»æè ã«ãã£ãŠå¶åŸ¡ããããããã¯ã«é¢ããæ å ±ã
2.7ã·ã§ã«ã³ãŒããžã®ç§»è¡ã®éå§
ã·ã§ã«ã³ãŒããžã®ç§»è¡ã¯ãäžèšã®ãããã¯ã®æºåäžã«äœæãããNumberãªããžã§ã¯ããšã®åçŽãªå¯Ÿè©±ã«ãã£ãŠå®è¡ãããŸãã å ·äœçã«ã¯ãJavaScriptå®è£ ã®åºã«ãªãNumberInstanceãªããžã§ã¯ãã®ä»®æ³ã¡ãœããã匷å¶çã«åŒã³åºãå¿ èŠããããŸãã äžæžããããŠããªããããã¯ã®å Žåãå®è¡ã¯*ïŒïŒ* pNIïŒ+ 4 * kïŒã«è»¢éãããŸããkã¯ãåŒã³åºãããä»®æ³é¢æ°ããŒãã«å ã®ã¡ãœããã®ã€ã³ããã¯ã¹ã§ãã è匱ãªãããã¡ã®çŽåŸã«ç¶ããããã¯ã®å Žåãå®è¡ã¯*ïŒïŒ* pSledïŒ+ 4 * kïŒã«è»¢éãããŸãã ãã®pSledã®äºééåç §ã¯å°ãé¢åã§ããã以äžã®ã±ãŒã¹ã¹ã¿ãã£ã¯ããã«å¯ŸåŠããç°¡åãªæ¹æ³ã瀺ããŠããŸãã
次ã®JavaScriptã¯ãNumberInstanceãªããžã§ã¯ãããšã«ä»®æ³é¢æ°åŒã³åºããè¡ããã·ã§ã«ã³ãŒãã®å®è¡ãéå§ããŸãã
for (i=901; i<1000; i+=2) { document.write(bigdummy[i][0] + "<br />"); }
3.ã±ãŒã¹ã¹ã¿ãã£
JavaScriptã®æã䜿çšããä¿¡é Œã§ããäœæ¥ã®åéã§ã®ç§ãã¡ã®ç 究ã¯ãPCREïŒPerl-Compatible Regular ExpressionïŒWebKitã®åæã§èŠã€ãã£ãè匱æ§ã«åæ©ä»ããããŸããã ããã¯æŽæ°ãªãŒããŒãããŒã§ãããã³ã³ãã€ã«ãããæ£èŠè¡šçŸãå«ããããã¡ãŒã®èåŸã§ä»»æã®ãªãŒããŒãããŒãµã€ãºãèš±å¯ããŸãããæ倧ãµã€ãºã¯65535ãã€ãã§ãã ãã ãããããã¡ãå²ãåœãŠãããçŽåŸã«ãªãŒããŒãããŒãçºçããããããªãŒããŒãããŒäžã«æªå²ãåœãŠã¡ã¢ãªã«ééããããšããããããŸããã ä»ã®ã±ãŒã¹ã§ã¯ãéèŠãªããŒã¿ãæžãçŽããŸããããå®è¡éã§ã©ã®ããŒã¿ãå€æŽããããã¯ãŸã£ããäºæž¬äžå¯èœã§ããã ã»ã¯ã·ã§ã³2ã§èª¬æããæ©åšã¯ãããã®åé¡ã解決ããä¿¡é Œæ§ã®é«ãåäœãä¿èšŒããŸããã
æåã«ãçŽ4000ãã€ãã®ã¿ãŒã²ãããµã€ãºã®ããŒããæé©åããå¿ èŠããããŸããã 次ã®ãããã¬ãŒåºåã¯ãæåã®ããã€ãã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã䜿çšããŠããŒããæé©åããæ¹æ³ã瀺ããŠããŸãïŒãã£ã¹ããªãã¥ãŒã·ã§ã³ã¢ãã¬ã¹ã®åšãã®ãžã£ã³ãã«æ³šæããŠãã ããïŒã
Breakpoint 3, 0x95850389 in KJS::ArrayInstance::ArrayInstance () array buffer at$1 = 0x16278c78
Breakpoint 3, 0x95850389 in KJS::ArrayInstance::ArrayInstance () array buffer at$2 = 0x50d000
Breakpoint 3, 0x95850389 in KJS::ArrayInstance::ArrayInstance () array buffer at$3 = 0x510000
Breakpoint 3, 0x95850389 in KJS::ArrayInstance::ArrayInstance () array buffer at$4 = 0x16155000
Breakpoint 3, 0x95850389 in KJS::ArrayInstance::ArrayInstance () array buffer at$5 = 0x1647b000
Breakpoint 3, 0x95850389 in KJS::ArrayInstance::ArrayInstance () array buffer at$6 = 0x1650f000
Breakpoint 3, 0x95850389 in KJS::ArrayInstance::ArrayInstance () array buffer at$7 = 0x5ac000
ã»ãŒ1000ã®é åžãå®äºãããŸã§ã«ãããŒãã¯ããªãäºæž¬å¯èœã«èŠãå§ãããã¹ãŠã®é åžã¯æçµçã«é£ç¶ããŸãã
Breakpoint 3, 0x95850389 in KJS::ArrayInstance::ArrayInstance () array buffer at$997 = 0x17164000
Breakpoint 3, 0x95850389 in KJS::ArrayInstance::ArrayInstance () array buffer at$998 = 0x17165000
Breakpoint 3, 0x95850389 in KJS::ArrayInstance::ArrayInstance () array buffer at$999 = 0x17166000
Breakpoint 3, 0x95850389 in KJS::ArrayInstance::ArrayInstance () array buffer at$1000 = 0x17167000
Breakpoint 3, 0x95850389 in KJS::ArrayInstance::ArrayInstance () array buffer at$1001 = 0x17168000
Breakpoint 3, 0x95850389 in KJS::ArrayInstance::ArrayInstance () array buffer at$1002 = 0x17169000
ã»ã¯ã·ã§ã³2.4ã§èª¬æããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ææ³ã䜿çšããŠãæåŸã«å€æ°ã®ããŒã«ã解æŸãããšã0x17168000ã§å¶åŸ¡ããããŒã¿ã®çŽåã®0x17168000ã®æåŸã®ããŒã«ã§è匱ãªãããã¡ãŒãããããã¢ãŠãããããšãããããŸãã
Breakpoint 2, 0x95846748 in jsRegExpCompile () regex buffer at$1004 = 0x17168000
ãããã£ãŠãæ£èŠè¡šçŸãããã¡ãŒãArrayStorageããŒã¿ã«ãªãŒããŒãããŒãããŸãã ãªãŒããŒãããŒãã€ãã¯ãæ£èŠè¡šçŸãã€ãã«ã³ã³ãã€ã«ããå¿ èŠããããŸãã 幞ããªããšã«ãæ£èŠè¡šçŸæåã¯ã©ã¹ã®æ§ç¯ã«ããã33ãã€ãã«ã³ã³ãã€ã«ããããããã³ã³ãã€ã«ããã圢åŒã§ã»ãŒä»»æã®ãã€ããèš±å¯ãããŸããæåŸã®32ãã€ãã¯256ããããããã®é åã§ãã ã ãããã£ãŠãæåã¯ã©ã¹[\ x00 \ x59 \ x5c \ x5e]ã䜿çšããArrayStorageããŒã¿ã®å é ã«é 眮ããŸããããã¯ãã³ã³ãã€ã«ããããããã¯ã©ã¹ã®æåã®3ã¯ãŒããéãŒãdwordããŒãdwordãããã³ããŒãå ã®ã¢ãã¬ã¹ãã€ãŸãïŒ
0x00000001 0x00000000 0x52000000
æåŸã«ãããŒãäžã§ç¹å¥ã«çŽ°å·¥ãããã¢ãã¬ã¹ã䜿çšãã倧ããªdwordæåå0x52780278ã䜿çšããŠããã®åŸã«ã·ã§ã«ã³ãŒããç¶ããŸãã ãã®ã¢ãã¬ã¹ãå¿ èŠãªç¯å²å ã«ãªãããã«ãã¹ãã¬ãŒã®é åžãæé ããŸãã 次ã«ãå®è¡éå§åŸã«åœä»€ãšããŠè§£éããããšãæ¡ä»¶ä»ããžã£ã³ãã«ãªããŸãã
78 02: js +0x2 78 52: js +0x52
é·ç§»æ¡ä»¶ã®å€ã«é¢ä¿ãªãæå¹ãªNOPã§ããæ¡ä»¶ãçã®å Žåã次ã®ã³ãã³ãã®å é ã«2ã®ãžã£ã³ããè¡ãããŸããæ¡ä»¶ãåœã®å Žåã0x52ã®ãžã£ã³ãã«ã€ããŠãçã§ã¯ãããŸããã ããã¯ãããŒãã¹ãã¬ãŒã¢ãã¬ã¹ã決å®ããéã®æãéèŠãªãã€ããã¹ã¬ããã§å®å šã«äœ¿çšãããŠãããã4ãã€ãã§ã¢ã©ã€ã¡ã³ããããŠããããšãæå³ããŸãã
4.çµè«
ãã®èšäºã§èª¬æããææ³ã«ããããããã¡ãªãŒããŒãããŒã®ä¿¡é Œæ§ã®é«ãåäœã確ä¿ããããšãã§ããŸãããæåã¯ãæžãæãã®ããã®äºæž¬å¯èœãªèå³æ·±ãããŒã¿ããããŸããã§ããã æ»æè ãé ä¿¡ãµã€ãºããªãŒããŒãããŒãµã€ãºããªãŒããŒãããŒããŒã¿ãªã©ãã·ã¹ãã ãå¶åŸ¡ããå¿ èŠãããéããæ»æè ãJavaScriptã«ã¢ã¯ã»ã¹ã§ããå Žåããã®ã¡ãœãããä»ã®ãã©ãŠã¶ãŒã®è匱æ§ã«é©çšããå¿ èŠããããŸãã ä»ã®ã¯ã©ã€ã¢ã³ãåŽã¹ã¯ãªããèšèªã䜿çšããå Žåãåæ§ã®æ¹æ³ãé©çšãããå¯èœæ§ããããšæãããŸãã