2016-09-29 9 views
7

के साथ 0x00 से शुरू होने वाले पते पर लिखना "हैकिंग - द आर्ट ऑफ एक्सप्लॉयशन" पुस्तक पढ़ना; मैं लेखक का अनुसरण कर रहा हूं क्योंकि वह ढेर को बहने और फ़ंक्शन के रिटर्न पते को बदलकर निष्पादन प्रवाह को बदलता है। (विशेष रूप से, पेज 135-136) वह एक पर्ल स्क्रिप्ट के साथ यह करने के लिए, 10 बार एक कमांड लाइन तर्क के रूप में वापसी पता दर्ज प्रबंधित करता है:एक पर्ल स्क्रिप्ट

$ ./auth_overflow2 $(perl -e 'print "\xbf\x84\x04\x08"x10') 

जहां 0x080484bf वापसी पता है।

मैं ऐसा करने की कोशिश कर रहा हूं, लेकिन मेरा वापसी पता 0x00 से शुरू होता है। \ X08 को \ x00 के साथ बदलकर, शून्य वर्ण छोड़ा जाता है, इसलिए पता जिसे मैं दर्ज करना चाहता हूं उसे स्मृति मानचित्र में बाइट द्वारा स्थानांतरित किया जाता है। मैं इसके आसपास कैसे काम कर सकता हूं?

+1

मुझे नहीं लगता कि यह समझ में आता है। बैश नल के साथ तारों को संभाल नहीं सकता है, लेकिन अगर ऐसा होता है, तो आप इस तरह की एक स्ट्रिंग को किसी प्रक्रिया के तर्क के रूप में पारित नहीं कर पाएंगे क्योंकि 'exec' को शून्य समाप्त तारों की अपेक्षा करता है और इस प्रकार यह शून्य के बाद सभी पात्रों को अनदेखा कर देगा। – redneb

+0

@redneb मैं देखता हूं ... क्या आप पासवर्ड के रूप में गठित पते के साथ स्मृति भरने के किसी भी वैकल्पिक तरीके के बारे में सोच सकते हैं? (0x00 से शुरू होने वाले पते सहित) –

+1

आपको स्वीकार करने के लिए 'auth_overflow2' को संशोधित करना होगा उदा। पते का हेक्स प्रतिनिधित्व। – redneb

उत्तर

7

कमांड लाइन-तर्क एनयूएल-समाप्त तार हैं। इसलिए, आप एक एनयूएल युक्त एक स्ट्रिंग पास नहीं कर सकते हैं। इसे स्ट्रिंग का अंत माना जाएगा।

$ perl -e'system("echo", "abc\x00def", "ghi\x00jkl");' 
abc ghi 

यह जानकर, शैल तर्क बनाते समय एनयूएल को अलग कर रहा है।

$ perl -e'printf "%v02X\n", $_ for @ARGV' "$(perl -e'print "\xbf\x84\x04\x08" x 5')" 
BF.84.04.08.BF.84.04.08.BF.84.04.08.BF.84.04.08.BF.84.04.08 

$ perl -e'printf "%v02X\n", $_ for @ARGV' "$(perl -e'print "\xbf\x84\x04\x00" x 5')" 
BF.84.04.BF.84.04.BF.84.04.BF.84.04.BF.84.04 

auth_overflow2 पते, उदा का एक भाग निकले रूप ले करने के लिए संशोधित किया जाना चाहिए हेक्स में पता।

संबंधित मुद्दे