Skip to content

Instantly share code, notes, and snippets.

@windows98SE
Created November 16, 2014 15:29
Show Gist options
  • Save windows98SE/91c3e36590e9b8bcb194 to your computer and use it in GitHub Desktop.
Save windows98SE/91c3e36590e9b8bcb194 to your computer and use it in GitHub Desktop.
[chatlog] irc 2600thailand
<Xelenonz> xellos: พี่เอว่างปะ ผมถาม ms14-64 โหน่ย
* Longcat ([email protected]) has joined
* ChanServ gives channel operator status to Longcat
<xellos> คำถามคือ
<Xelenonz> https://docs.google.com/a/e-cq.net/document/d/1SQsnKdLDOBQdbhJmIQ167WZhFLOaz3b2uTlkHNKtNSg/edit?pli=1 ไล่ตาม code ในนี้อะครับ
<Xelenonz> มันเป็นบัค interger ที่ทำให้เกิด type confusion ปะหว่า
<Xelenonz> - -" ไม่รู้ผมเข้าใจถูกป่าว
<xellos> integer overflow ก็ใช่นะ
<xellos> แต่ type confusion นั้น มันแค่เป็นวิธี exploit
<xellos> blog ของ coverity มันอธิบายปัญหาหมดแล้วนิ
<Xelenonz> ตอนแรก ผมอ่านผ่านๆก่อนอะครับ ยาวเกินเลย note ไว้ก่อน แล้วลองอ่านโค้ดแล้วมั่วเอาแทน - -"
<Xelenonz> เหลือ exploit variant type ._."
<Xelenonz> <xellos> Pwniez: ขอ ms14-064 ฉบับภาษาไทย << เสร็จแล้ว :P
<xellos> ไหน
<Xelenonz> ลิ้งที่ให้ดูไงครับ ฮ่าๆ
<xellos> มีแต่อังกฤษ
<Xelenonz> หน้า 2 มีแค่หน้าเดียวนั้นเลย :P
<xellos> แล้วรู้มั้ยว่ามันผิด
<xellos> อธิบายผิด
<Xelenonz> ไม่รู้นี่แหละ เลยถามพี่เอก่อน - -"
<xellos> ไล่ตาม http://rop.sh/ida.html ละกัน
<xellos> ตัวแปรตั้งได้ปวดหัวมาก
<Xelenonz> อันนั้นอันเก่านะครับ ชื่อตัวแปรบางตัวผมยังมั่วอยู่
<Xelenonz> ตอนแรกไม่รู้ตัวแปรใช้ทำอะไรเลยตั้งแก้ขัดไปก่อน แล้วค่อยแก้ทีหลัง
<xellos> มีอันใหม่มะ
<xellos> จะได้ไล่ง่ายๆหน่อย
<Xelenonz> ผมว่าไม่น่าต่าง แต่ลองดูก็ได้ ฮ่าๆ
<xellos> ไล่ได้แหละ
<xellos> oldSafeArraySize = SafeArraySize(_psa); // คำนวณหา จำนวน byte ที่ใช้
<Xelenonz> เพิ่งอัพเส็จตะกี้ - -
<xellos> หลังจากนั้น
<xellos> v6 = _psa->rgsabound[0].cElements; v21 = _psa->rgsabound[0].lLbound; _psa->rgsabound[0].cElements = _psaboundNew->cElements; _psa->rgsabound[0].lLbound = _psaboundNew->lLbound;
<xellos> copy & paste ไม่มีบรรทัดใหม่แหะ
<xellos> ตรง v20 มันคือ SAFEARRAYBOUND
<xellos> เขียนข้างบนใหม่ง่ายๆ เป็น
<xellos> originalBound = psa->rgsabound[0];
<xellos> psa->rgsabound[0] = *psaboundNew;
<xellos> คือ เก็บ bound เก่าไว้ แล้วใส่ bound ใหม่ที่ต้องการเข้าไป
<xellos> newSafeArraySize = SafeArraySize(_psa); // คำนวณหา จำนวน byte ที่ต้องการจะให้เป็น
<xellos> diffSize = newSafeArraySize - oldSafeArraySize; // แล้วลบกัน
<xellos> ถ้าเป็น 0 คือเท่าเดิม ไม่ต้องทำอะไร
<xellos> ถ้า > 0 คือขยาย
<xellos> ถ้า < 0 คือหด
<xellos> ปัญหาหนึ่งคือจุดนี้ ถ้าเราใส่ให้มันขยาย แต่ผลลัพธ์มันออกมาเป็นลบ
<xellos> โปรแกรมก็จะคิดว่าเราต้องการจะหด
<icheernoom> *0*
<xellos> แล้วก็ invertDiffSize = -(newSafeArraySize - oldSafeArraySize); // คำนวณ size ที่หด เพื่อที่จะ allocate memory มาใส่ในนี้ชั่วคราวก่อน
<xellos> หลังจากนั้นก็ newArray = (void *)(*(int (__stdcall **)(SAFEAR... // อันนี้คือ alloc
<xellos> ถ้า alloc fail ไป E_OUTOFMEMORY
<xellos> เห็นปัญหามะ
<xellos> ถ้า fail ตรงนี้ rgsabound มันโดนกำหนดเป็นค่าใหม่แล้ว
<xellos> แต่ไม่ได้ restore ค่ามันกลับเป็นค่าเดิม
* Longcat ลงชื่อเข้ามาดูใน log ของนัก cap ในตำนาน
<Xelenonz> อ่อ จริงด้วยแหะ
<Xelenonz> ไม่ได้คิดถึงตรงนั้นเลย
<Xelenonz> lol
* Xelenonz ลงชื่อด้วย *0*
* xellos ลงชื่อด้วย
* icheernoom ลงชื่อออ
* Xelenonz is now known as noob
<whoami> เดี๋ยวๆ .. พวกลงชื่อมันอยุ่ตั้งแต่แรกแล้วทั้งนั้น
<noob> เปลี่ยนชื่อแพ่บ
<xellos> bug มันอยู่ 2 ที่
<xellos> integer overflow ที่หนึ่ง
<xellos> ลืม restore ค่ากลับอีกที่หนึ่ง
<Pwniez> ใครเอา nick Xelenonz ไปใช้เนี่ย โดนแอบอ้างอีกละ - -"
<noob> Pwniez: โทดครับพี่ ผมเปลี่ยนชื่อละ
<noob> ต่อเลยครับ :D
<xellos> - -'
<xellos> exploit ก็แค่ redim ให้มันใหญ่ ใส่ค่าให้มัน overflow แล้ว diff จะได้เป็นลบ
<xellos> ถ้า size เป็นประมาณ 0x80000000
<xellos> ยังไงก็ alloc fail
<xellos> ผลลัพธ์ที่ได้คือ array นั้น ขนาดใน memory เท่าเดิม แต่โปรแกรมจะคิดว่ามีขนาดใหญ่มาก
<xellos> ทำให้สามารถ access ได้เกินกว่าที่ allocate ไว้
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment