Last active
August 29, 2015 14:09
-
-
Save windows98SE/6c7883846431b6f255ee to your computer and use it in GitHub Desktop.
[chatlog] irc 2600thailand
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<Sumedt> สอบถามเรื่อง MS14-064 หน่อยครับ | |
<Sumedt> ถ้าเราจองพื้นที่เหมือนใน http://blog.trendmicro.com/trendlabs-security-intelligence/a-killer-combo-critical-vulnerability-and-godmode-exploitation-on-cve-2014-6332/ | |
<Sumedt> ที่ aa ต่อกับ ab อ่ะครับ | |
<Sumedt> ผมเข้าใจถูกมั้ยว่าถ้าเราขยายขนาดของ aa ด้วยเลขขนาดใหญ่มาก SAFEARRAYREDIM ก็จะทำงานตามปกติ ไปจนถึงการจองพื้นที่จะพบว่าไม่สามารถจองพื้นที่ได้เนื่องด้วยค่ามากกว่า 0x8000000 | |
<Sumedt> นั่นเอง หรือก็คือโปรแกรมให้ขนาดของ memory ที่เราใช้เท่าเดิมเพราะจองพื้นที่ memory ไม่ได้ แต่เรากลับได้ขอบเขตของ array เพิ่มมากขึ้น ทำให้เราสามารถเข้าถึงพื้นที่ของ aa | |
<Sumedt> ที่เพิ่มมากขึ้น ซึ่งพื้นที่ที่เพิ่มมากขึ้นนั้นก็จะไปคาบเกี่ยวกับพื้นที่ของ ab ทำให้ aa สามารถเข้าถึงพื้นที่ของ ab ได้นั่นเอง | |
* LongCatBot (uid24583@2600TH-member-97g.i0u.epq510.IP) has joined | |
<xellos> redim ทำงานไม่ปกตินะ | |
<xellos> ขยายจำนวนใน array 0x8000000 มันจะได้ size เป็น 0x80000000 | |
<xellos> ตอนแรกมันเป็น unsigned ก็ถูกอยู่หรอก | |
<xellos> พอเอามา diff กัน ใช้เป็น signed integer มันกลายเป็นลบ | |
<xellos> ทำให้โปรแกรมคิดว่า ต้องการลดขนาดของ array | |
<xellos> ดู source ที่เพิ่มไปให้เมื่อวาน https://gist.github.com/worawit/77a839e3e5ca50916903#file-safearrayredim-cpp-L66 | |
<Sumedt> diff กลายเป็นลบเพราะค่า unsigned หรือเปล่าครับ | |
<Sumedt> หมายถึงว่ามันมองค่า arraySizeNew เป็นลบเพราะ unsigned หรือเปล่าครับ | |
<xellos> arraySizeNew ตรงนี้ไม่ได้ดูที่ assembly ว่ามันเป็น signed หรือ unsigned | |
<xellos> แต่ arraySizeDiff เป็น signed แน่ๆ | |
<Sumedt> ผมเห็น http://blog.trendmicro.com/trendlabs-security-intelligence/a-killer-combo-critical-vulnerability-and-godmode-exploitation-on-cve-2014-6332/ ตรงที่มันอธิบาย sub(diff) แบบนี้อ่ะครับ เลยคิดว่าเป็นงั้น | |
<Sumedt> If sub < 0, goto less_alloc to reallocate memory by function ole32!CRetailMalloc_Realloc() | |
<Sumedt> In this case, go this branch. Though sub > 0×8000000 as unsigned integer, sub is treated as negative value here because opcode jge works on signed integer. | |
<xellos> ULONG a = 0x80000000; // a = 2^31 | |
<xellos> LONG b = 0x80000000; // b = -(2^31) | |
* Longcat (Longcat@2600TH-member-ltv.hi1.9i01iu.IP) has joined | |
* ChanServ gives channel operator status to Longcat | |
<xellos> คือของ trendmicro มันไม่ได้บอกในแง่ของโปรแกรม มันมอง (unsigned) 0x80001234 - 0x1000 มันควรที่จะ check ผลลัพธ์แบบ unsigned | |
<Sumedt> อ๋อๆๆ มองที่ diff ต้องเป็น signed | |
<Sumedt> ค่าที่เกิน มันเลยถูกมองว่าเป็นลบ | |
<xellos> แต่ assembly ใช้ jge แสดงว่า compare แบบ signed integer ทำให้โปรแกรมคิดผิด ไปอีก branch หนึ่ง | |
<xellos> อีก branch หนึ่งของ trendmicro ก็คือลดขนาด array | |
<xellos> ไล่ code ที่เป็น c ไปดีกว่า เข้าใจง่ายกว่า | |
<Sumedt> pDataLost = pMalloc->Alloc(-arraySizeDiff); | |
<Sumedt> ที่ตรงนี้มันจองไม่ได้เพราะ arraySizeDiff มันมากกว่า 0x8000000 เข้าใจถูกมั้ยครับ | |
<xellos> เพราะมันมีขนาดใหญ่มาก | |
<xellos> ไม่มีทาง allocate memory ต่อกันใหญ่ขนาดนี้ได้ | |
<xellos> 32 bit ยังไงก็ fail | |
<Sumedt> โอเคครับ | |
<xellos> ต่อให้ ram พอก็ตาม | |
<xellos> พอ fail ตรงนี้ ก็ไปเจออีก bug หนึ่ง | |
<Sumedt> แล้วทีนี้ psa->rgsabound[0] มันไม่คืนค่า ก็จะทำให้ data ของ arrX มันไปถึงส่วน type,pad,data ของ arrY เข้าใจถูกมั้ยครับ | |
<Sumedt> คือผมงงว่าถ้าค่าข้อมูลมันต่อกันภาพเหมือนของ trendmicro ทำไมไม่เหมือนของพี่เอ | |
<Sumedt> ที่ arrX ไปอยู่ตรงกลางแทน | |
<Sumedt> ภาพ memory ในบรรทัดที่ 39-43 ของ code poc อ่ะครับ | |
<xellos> arrX(olapPos) อยู่ตรงกลาง | |
<xellos> arrX(0) .. arrX(olapPos-1) อยู่ข้างหน้า ไม่ได้เขียน | |
<Sumedt> อ๋ออออออออ | |
<Sumedt> โอเค ก็งงอยู่ตั้งนาน | |
<Sumedt> ว่าทำไมมันไปอยู่ตรงนั้น | |
<xellos> ตรงนี้ต้องกลางให้เห็นว่า ต้องการให้มัน overlapped กัน | |
<xellos> เขียนส่วน data อันหนึ่ง กลายเป็นเขียน type ของอีกอันหนึ่ง | |
<Sumedt> โอเคครับ | |
<Sumedt> ขอบคุณครับ | |
<Sumedt> เข้าใจแล้วครับ | |
<xellos> อีกอย่าง ms14-064 มันมี 2 cve นะ นี่แค่ cve เดียว | |
<Sumedt> CVE-2014-6332 แ | |
<Sumedt> แล้วมีตัวอื่นอีก? | |
<xellos> https://technet.microsoft.com/en-us/library/security/MS14-064 | |
<xellos> cve-2014-6352 ใช้กับ ms office | |
<Sumedt> อ่อๆ | |
* Xelenonz มาลงชื่อ | |
* Sumedt has quit (Ping timeout: 121 seconds) | |
<xellos> Xelenonz: วันหลังเป็นคนตอบเลย | |
<Xelenonz> o_O | |
* whoami มึนแป๊ป | |
<xellos> version ภาษาไทยยังไม่เห็นเลย | |
<Xelenonz> เด่วพี่เมธก็ทำแล้ว :P | |
<xellos> เอา technical version | |
<Xelenonz> วันนี้นั่งเรียน วิธีใช้ Pointer ใน C ใหม่หมด - -" | |
<Xelenonz> http://www.amazon.com/Understanding-Using-Pointers-Richard-Reese/dp/1449344186 | |
<xellos> งั้นถาม | |
<Xelenonz> ห๊ะ | |
<xellos> const char *a; | |
<xellos> char const *a; | |
<xellos> const char const *a; | |
<xellos> ต่างกันยังไง | |
<Xelenonz> อันแรกสร้าง pointer ชี้ไป const char | |
<Xelenonz> อันสองคิดว่า pointer เป็น const แบบ char type | |
<Xelenonz> อัน 3 pointer เป็น const ชี้ไปที่ const char | |
<Xelenonz> - -a | |
* Xelenonz 2 อันหลังมั่ว | |
<Xelenonz> เห็นเค้าว่าให้อ่านจากหลังไปหน้า | |
<xellos> ก็ถูก แต่ความแตกต่างอะ | |
<xellos> ตอบอย่างนี้ Longcat เข้าใจเปล่า | |
* jmaster (jmaster@2600TH-member-86u.5t7.rubrv0.IP) has joined | |
<Xelenonz> อันแรก pointer address แก้ค่าได้ | |
<Xelenonz> เรียบเรียงคำพูดแปป - -' | |
<Longcat> ไม่เข้าใจจจ | |
<whoami> เพิ่งเรียนถึง char a; | |
* Sumedt (Sumedt@2600TH-member-meu.v74.s551bd.IP) has joined | |
* whoami ยังไปไม่ถึง pointer ฮ่าๆ | |
<xellos> อันแรก แก้ pointer ให้ชี้ไปที่อื่น แต่แก้ค่าตัวอักษรที่ pointer ชี้อยู่ไม่ได้ | |
<Xelenonz> 1. pointer แบบแก้ค่า address ได้ ชี้ไปที่ตัวแปรประเภท const char แต่จะไม่สามารถแก้ค่า value ได้ | |
<Xelenonz> 2. pointer แบบ constant แก้ค่า address ไม่ได้ แต่ยังสามารถแก้ค่า value ได้อยู่ | |
<Xelenonz> 3. pointer แบบ const ชี้ไปที่ const char แก้ค่า address และ value ไม่ได้ | |
<xellos> อันสอง แก้ pointer ให้ชี้ไปที่อื่นไม่ได้ แต่แก้ค่าตัวอักษรที่ pointer ชี้อยู่ได้ | |
<xellos> แค่นี้แหละ | |
<Xelenonz> \o/ | |
<xellos> เอา pointer to function ดีกว่า หนุกดี | |
* xellos คิดคำถามไม่ออก | |
<Xelenonz> (*fptr)(type) | |
<Sumedt> arrY(0) = 6.36598737437801E-314 ' 0000000300000003 ( type vbLong ) ทำไปทำไมอ่ะครับ | |
<Xelenonz> ต้อง type (*fptr)(type,type) สิ | |
<Sumedt> ที่ function leakfnaddr อะ | |
<xellos> แก้ type ของ arrX(olapPos) ให้เป็น long | |
<Sumedt> อ๋อๆๆ | |
<Sumedt> เพราะมันเกี่ยวกันอยู่ | |
<Sumedt> (overlap)กันอยู่ | |
* Xelenonz มาลงชื่อใหม่ (รอบที่แล้วไม่ติด) | |
* Longcat has quit (Ping timeout: 121 seconds) | |
<Xelenonz> อย่าเงียบสิ ใจคอไม่ดีเลย | |
<xellos> จบแล้ว | |
* Xelenonz ตกรถรอบ 2 T_T |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment