PDA

View Full Version : stack overflow



theinfinity
شنبه 08 خرداد 1389, 01:23 صبح
یه برنامه دارم که مثه تمام برنامه های دیگه یه stack seg توی حافظه داره، یه تابع اجرا می کنم که یه متغییر به نام buffer داره، که اصولا buffer باید در بالاترین نقطه stack قرار بگیره!
حالا اگه من buffer رو overflow کنم(به دلایل کاملا شخصی:لبخند:) چرا مقادیری که سر ریز میشه و میریزه بیرون، توی return address و ... overwrite میشه در صورتی که منطقا باید در فضای بیرون پشته بریزه .که عملا return address در پشته پایین تر از buffer قرار دارن؟
عکسم برای روشن شدن موضوع

tdkhakpur
شنبه 08 خرداد 1389, 23:33 عصر
یه تابع اجرا می کنم که یه متغییر به نام buffer داره، که اصولا buffer باید در بالاترین نقطه stack قرار بگیره!
حالا اگه من buffer رو overflow کنم(به دلایل کاملا شخصی:لبخند:) چرا مقادیری که سر ریز میشه و میریزه بیرون، توی return address و ... overwrite میشه در صورتی که منطقا باید در فضای بیرون پشته بریزه .که عملا return address در پشته پایین تر از buffer قرار دارن؟


خب شما نحوه صدا یا call کردن توابعتان به چه شکلی هست کدتان را ارسال کنید!

theinfinity
یک شنبه 09 خرداد 1389, 00:44 صبح
کد ها با C نوشته شده بعد کامپایل شده

Developer Programmer
یک شنبه 09 خرداد 1389, 09:39 صبح
تصور من اینه که عکس رو برعکس کشیدین مگر اینکه نحوه پر و خالی شدن پشته از پایین شکله...دقت کنین که پشته فقط از یک طرف پر و از همون طرف هم خالی میشه. پس اگه زیاد push کنین سرریز میکنه.

http://www.codeproject.com/kb/tips/stackdumper/stackdumper.gif
در حقیقت وقتی یه روتین رو فراخوانی میکنین پرولوگ به طریق زیر انجام میشه


push ebp ; Save ebp
mov ebp, esp ; Set stack frame pointer
sub esp, localbytes ; Allocate space for locals
push <registers> ; Save registers
و بعد از اتمام تابع به طریق زیر اپیلوگ انجام میشه


pop <registers> ; Restore registers
mov esp, ebp ; Restore stack pointer
pop ebp ; Restore ebp
ret ; Return from function
برای نوشتن اکسپلویت کافیه یک بار کدتون رو با ollydbg اجرا کنین و ببین که old ebp در کدوم آدرس میافته تا اون رو با آدرس جدید جایگزین و payload رو در آدرس مربوطه بنویسین.
البته استفاده از مقادیر زیاد xor eax,eax و nop باعث میشه که بایت های غیرلازم رو با مقادیر مطمئن پر کنین و همیشه در آدرس لازم،مقدار لازم رو داشته باشین.

مقاله Smashing The Stack For Fun And Profit و Playing with the stack رو مطالعه بفرمایید