Buffer Overflow

mirakiht
3 min readOct 3, 2022

--

เอาละทุกคนนน พอเรา set up จาก session ที่ผ่านมาเรียบร้อยแล้วต่อมาเราจะมาทำความรู้จักการทำ buffer overflow กันนน

buffer overflow นั้นถ้าพูดให้เข้าใจง่ายๆคือ การทำให้ buffer มันล้นนั้นเองงง

แบบที่ 1ที่เราจะแนะนำคือ การทำให้ buffer มันล้นแล้วก็ได้ flag เลย

โจทย์ตัวอย่าง ref มาจาก RTARF 2022 ข้อ pwn easy : ctfx1

ขั้นแรก file ดูว่า เป็น 64 bit หรือ 32 bit

จะเห็นว่า เป็น ELF 64-bit ที่เราต้องเช็คเพราะว่า 64 bit จะใช้ register แตกต่างจาก 32 bit

และต่อมาใช้ ghidra เพื่อดู c code ด้านใน จะเห็นว่า มีการใช้ function gets(local_c8); ซึ่งฟังชั่น gets() นั้นเป็นฟั่งชั้นที่ใช้ในการรับค่า ในภาษา c แต่มันมีช่องโหว่ก็คือ ถ้าเราใส่ค่าที่มันมากกว่า buffer ที่เรากำหนดไว้ในนี้ buffer คือ local_c8[184] กล่าวคือมี buffer 184 byte พูดง่ายๆคือ ใส่ a ได้ 184 ตัวนั้นแหละ แต่จากช่องโหว่ gets() นั้นถ้าเราใส่เกิน buffer มันก็จะล้นไปทับส่วนอื่นของ stack แทน

เรามาดู stack ของ program ctfx1 กันนนน

จาก c code ใน ghidra จะเห็นว่า ถ้าเราทำให้ local_c ไม่เท่ากับ 0 ก็ทำการ cat flag.txt ดังนั้น

เราก็จะใส่ A buffer 184 + 4 byte เพื่อทับ local_10 + 1 byte เพื่อให้ไปทับ local_c รวมเป็น 189 byte ก็คือ A 189 ตัวนั้นเองง

แล้วรู้ได้ยังไงว่า local_10 มี 4 byte ถ้าดูจาก assembly code จะเห็นว่า movl $0xa,-0x8(%rbp) ซึ่ง movl นั้น มีความหมายว่า copy 4 byte ซึ่ง ใน at&t syntax นั้น

b = 1 byte

w = 2 byte

l = 4 byte

เป็นค่าที่อยู่หลัง mov นั้นเองงง

stack ด้านบนนั้นมาจาก

ถ้าใครได้อ่าน blog ก่อนหน้า ก็จะเข้าใจการสร้าง stack จะเห็นว่ามีการ sub $0xd0,%rsp ก็คือมีการสร้าง buffer 0xd0 byte หรือ 208 byte นั้นเอง อาจจะงงว่าทำไมมันประกาศมาตอนแรก 184 byte แต่ทำไมมันสร้าง 208 byte ก็เพราะมันสร้างมาเผื่อ local variable ตัวอื่นยังไงละ แต่มันก็แล้วแต่ compiler ด้วยน้าาาา

ซึ่ง local_c local_10 local_c8 local_c9 นั้นคือ argument ที่ถูก pass เข้าไป ใน main() ก่อนที่จะเริ่ม function นั้นเอง

แต่จะเรียงจาก ล่างขึ้นบน เพราะ stack มันเริ่มจาก high memory address ไป low memory address ยังไงละค้าบบบบ

ผม ref มาจากภาพด้านบนน้าา แต่ภาพด้านบนเป็น 32 bit คล้ายๆกัน

ต่อไปเรามาทำการ exploit กันนนน

เขียน python script ตามด้านล่าง

from pwn import *

p = process('./ctfx1')
payload = "A"*189
p.sendline(payload)
p.interactive()

ได้ flag ออกมาแล้วววแต่นี่ไม่ใช่ flag จริงน้าาา ผมสร้างขั้นมาเองของจริงต่อ netcat ต่อไปที่ server แล้วเจอกัน session หน้าา บุยยยยย

--

--

mirakiht

hope u like my content | DarkArmy | ig : minnn.exe