Skip to content

Instantly share code, notes, and snippets.

@windows98SE
Last active August 29, 2015 14:09
Show Gist options
  • Save windows98SE/6c7883846431b6f255ee to your computer and use it in GitHub Desktop.
Save windows98SE/6c7883846431b6f255ee to your computer and use it in GitHub Desktop.
[chatlog] irc 2600thailand
<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