
ASLR बाईपास बिना infoleak के
इस लेख में, मैं Samuel Groß द्वारा अपने Remote iPhone Exploitation Part 2: Bringing Light into the Darkness -- a Remote ASLR Bypass में वर्णित तकनीक के अनुप्रयोग पर चर्चा करूँगा, ताकि Linux x86_64 पर ASLR को बायपास किया जा सके।
इसे दिखाने के लिए मैं Buckeye CTF से एक pwnable चुनौती, guess_god, हल करूँगा।
मैं सामग्री को यथासंभव शुरुआती-अनुकूल रखने की कोशिश करूँगा, इसलिए यदि आप काफी आत्मविश्वासी हैं और सिर्फ एक्सप्लॉइट देखना चाहते हैं तो किसी भी अनुभाग को छोड़ने में संकोच न करें।

मैंने CTF नहीं खेला, लेकिन CTF समाप्त होने से लगभग 2 घंटे पहले मुझे इस चुनौती में दिलचस्पी हो गई, Guray00 की बदौलत, जो fibonhack डिस्कॉर्ड में कुछ क्रिप्टो संबंधी शरारतों के बारे में मदद माँग रहे थे।
मैं उसकी मदद नहीं कर सका, लेकिन मैंने pwnable चुनौतियों पर नज़र डाली, और सोचा कि P0 ब्लॉगपोस्ट को समझना अच्छा होगा और उम्मीद है कि वह इनाम मिल जाए।
Address Space Layout Randomization (ASLR) एक कंप्यूटर सुरक्षा तकनीक है जिसमें किसी प्रक्रिया के एड्रेस स्पेस में एक निष्पादन योग्य (executable) के बेस एड्रेस तथा लाइब्रेरीज़, हीप और स्टैक की स्थिति को यादृच्छिक रूप से स्थित किया जाता है।
Linux पर, आप किसी प्रक्रिया का pid दिए जाने पर procfs के माध्यम से उसकी मैपिंग्स देख सकते हैं, फ़ाइल /proc/<pid>/maps को पढ़कर।
यदि आप एक प्रक्रिया हैं और अपनी खुद की मेमोरी मैपिंग्स जानना चाहते हैं, तो आप /proc/self/maps पढ़ सकते हैं।
उदाहरण के लिए, आप cat के साथ /proc/self/maps पढ़ने का प्रयास कर सकते हैं:```
root@088ec31b2ce9:/home/ctf/challenge# cat /proc/self/maps
55faeb01c000-55faeb01e000 r--p 00000000 fe:01 2497233 /usr/bin/cat
55faeb01e000-55faeb023000 r-xp 00002000 fe:01 2497233 /usr/bin/cat
55faeb023000-55faeb026000 r--p 00007000 fe:01 2497233 /usr/bin/cat
55faeb026000-55faeb027000 r--p 00009000 fe:01 2497233 /usr/bin/cat
55faeb027000-55faeb028000 rw-p 0000a000 fe:01 2497233 /usr/bin/cat
55faeb115000-55faeb136000 rw-p 00000000 00:00 0 [heap]
7fe15dfb1000-7fe15dfd5000 rw-p 00000000 00:00 0
7fe15dfd5000-7fe15dffb000 r--p 00000000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so
7fe15dffb000-7fe15e166000 r-xp 00026000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so
7fe15e166000-7fe15e1b2000 r--p 00191000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so
7fe15e1b2000-7fe15e1b5000 r--p 001dc000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so
7fe15e1b5000-7fe15e1b8000 rw-p 001df000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so
7fe15e1b8000-7fe15e1c3000 rw-p 00000000 00:00 0
7fe15e1c7000-7fe15e1c8000 r--p 00000000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so
7fe15e1c8000-7fe15e1ef000 r-xp 00001000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so
7fe15e1ef000-7fe15e1f9000 r--p 00028000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so
7fe15e1f9000-7fe15e1fb000 r--p 00031000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so
7fe15e1fb000-7fe15e1fd000 rw-p 00033000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so
7fff4388f000-7fff438b0000 rw-p 00000000 00:00 0 [stack]
7fff43989000-7fff4398d000 r--p 00000000 00:00 0 [vvar]
7fff4398d000-7fff4398f000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
root@088ec31b2ce9:/home/ctf/challenge# cat /proc/self/maps 55ffc0b1b000-55ffc0b1d000 r--p 00000000 fe:01 2497233 /usr/bin/cat 55ffc0b1d000-55ffc0b22000 r-xp 00002000 fe:01 2497233 /usr/bin/cat 55ffc0b22000-55ffc0b25000 r--p 00007000 fe:01 2497233 /usr/bin/cat 55ffc0b25000-55ffc0b26000 r--p 00009000 fe:01 2497233 /usr/bin/cat 55ffc0b26000-55ffc0b27000 rw-p 0000a000 fe:01 2497233 /usr/bin/cat 55ffc2108000-55ffc2129000 rw-p 00000000 00:00 0 [heap] 7f1ec6e0f000-7f1ec6e33000 rw-p 00000000 00:00 0 7f1ec6e33000-7f1ec6e59000 r--p 00000000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so 7f1ec6e59000-7f1ec6fc4000 r-xp 00026000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so 7f1ec6fc4000-7f1ec7010000 r--p 00191000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so 7f1ec7010000-7f1ec7013000 r--p 001dc000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so 7f1ec7013000-7f1ec7016000 rw-p 001df000 fe:01 2761561 /usr/lib/x86_64-linux-gnu/libc-2.33.so 7f1ec7016000-7f1ec7021000 rw-p 00000000 00:00 0 7f1ec7025000-7f1ec7026000 r--p 00000000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so 7f1ec7026000-7f1ec704d000 r-xp 00001000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so 7f1ec704d000-7f1ec7057000 r--p 00028000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so 7f1ec7057000-7f1ec7059000 r--p 00031000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so 7f1ec7059000-7f1ec705b000 rw-p 00033000 fe:01 2761539 /usr/lib/x86_64-linux-gnu/ld-2.33.so 7ffc72fa4000-7ffc72fc5000 rw-p 00000000 00:00 0 [stack] 7ffc72fe7000-7ffc72feb000 r--p 00000000 00:00 0 [vvar] 7ffc72feb000-7ffc72fed000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
### मेमोरी मैपिंग पैटर्न
यदि आप इसे कुछ बार करते हैं, तो आप अनुमान लगा सकते हैं कि:
* बाइनरी PIE बेस 0x00005500_00000000-0x00005700_00000000 की रेंज में होना चाहिए, जिसका अर्थ है 2TB संभावित पते।
* हीप बाइनरी के पास होता है।
* लाइब्रेरीज़ 0x00007f00_00000000 - 0x00007fff_ffffffff की रेंज में आती हैं, 1TB संभावित पते।
* स्टैक \(ज़्यादातर समय\) 0x00007ffc_00000000 - 0x00007fff_ffffffff की रेंज में जाता है, 16gb संभावित पते।
* रेंज 0xffffffffff600000 - 0xffffffffff601000 हमेशा मैप होती है, यदि आप उत्सुक हैं कि यह क्या है तो आप [यह लेख](http://terenceli.github.io/%E6%8A%80%E6%9C%AF/2019/02/13/vsyscall-and-vdso) पढ़ सकते हैं।
## 1.3 बिना infoleak के ASLR को कैसे बायपास करें
आइए चर्चा करें कि जब कोई information leak संभव न हो तो आप ASLR को बायपास करने के लिए क्या कर सकते हैं।
यह Saelo के ब्लॉगपोस्ट को पढ़कर मुझे जो समझ आया, उसे सारांशित करने का मेरा प्रयास है।
ASLR को बायपास करने के लिए आपको चाहिए:
* एक memory spraying तकनीक, जो आपको दिए गए आकार की सन्निहित मेमोरी को, पतों की दी गई रेंज पर मैप करने देती है।
जैसा कि वह कहते हैं, इसे करने के दो तरीके हैं:
1. memory leak का दुरुपयोग करके (information leak नहीं!), एक बग जिसमें मेमोरी का एक हिस्सा "भूल" जाता है और कभी freed नहीं होता, और इसे तब तक कई बार trigger करना जब तक वांछित मात्रा में मेमोरी leak न हो जाए।
2. एक "amplification gadget" ढूंढकर और उसका दुरुपयोग करके: कोड का एक टुकड़ा जो डेटा के मौजूदा हिस्से को लेता है और उसे कॉपी करता है, संभावित रूप से कई बार, जिससे attacker अपेक्षाकृत कम संख्या में bytes भेजकर बड़ी मात्रा में मेमोरी spray कर सकता है।
* एक `isAddressMapped` oracle, जो एक पता देने पर बताता है कि वह पता mapped है या नहीं।
### Linux पर ASLR बायपास का PoC
आइए Linux पर aslr को पूरी तरह से तोड़ने के लिए saelo के PoC को reproduce करने का प्रयास करें।