من یک break point روی read هم گذاشتم. تابع read رو که ببینید. fd یا همون فایلدیسکریپتورش همونجوری که گفتیم 0هست. یعنی stdin. یک بافری هم داره که آدرسش هست 0x7ffff7f88000 که مقداری که خوند رو بریزه توی این آدرسه.
💩3👍2❤1
چلنح در واقع از همینجا شروع میشه و حدودا دیشب ۳ ۴ ساعت وقت گرفت از من. لذا من دیگه از اینجا تخصصیتر و خلاصهتر میگم که نخوام ۴۰۰تا پیام بدم دیگه.
❤2👍2💩2
کاری که باید برای حلش کرد چیه؟ ما در نهایت باید کاری کنیم که به جای اینکه این cat خالی صرفا همون ورودیای که ما میدیم خروجی بده، بیاد محتوای فایل مدنظر ما که اسمش هست flag.txt رو چاپ کنه.
پس ما باید یه سری کار کنیم. اینکه بریم فایل flag.txt رو open کنیم تا fdش ساخته شه و لینک شه تا ما بتونیم readش کنیم چرا که read از روی یک fd اتفاق میوفته.
بعد که read کردیم بیاییم بریزیمش توی یک مقداری که همون مقدار بافر خودش کافی هست، و حالا write رو صدا بزنیم که بره مقداری که از read داره رو برامون write کنه.
پس ما باید یه سری کار کنیم. اینکه بریم فایل flag.txt رو open کنیم تا fdش ساخته شه و لینک شه تا ما بتونیم readش کنیم چرا که read از روی یک fd اتفاق میوفته.
بعد که read کردیم بیاییم بریزیمش توی یک مقداری که همون مقدار بافر خودش کافی هست، و حالا write رو صدا بزنیم که بره مقداری که از read داره رو برامون write کنه.
👍2💩2❤1
تابع open یک ورودی میگیره که اونم اسم فایل هست و مقدار توی rdi ریخته میشه. یعنی ما زمانی که میخوایم open رو صدا بزنیم باید مقدار rdi مون برابر با اسم فایلی باشه که میخوایم openش کنیم. یعنی همون flag.txt.
❤2💩2👍1
خب حالا ما چجوری این مقدار رو بگیریم و بریزیم توی rdi؟ همونطور که گفتیم، این cat خالی میاد ورودی مارو خروجی میده. پس اگر یه دور ما cat خالی رو صدا بزنیم و بدیم flag.txt، این میره توی بافرش مینویسه flag.txt و تنها کاری که ما نیازه بکنیم اینه که آدرس اون flag.txt رو بیاییم بریزیم توی rdi و سپس open رو صدا بزنیم که بره فایل flag.txt رو برامون open کنه و fdشو بسازه.
❤2💩2👍1
این کار با دستورای زیر انجام میشه.
توی break اولی ما اومدیم سر جایی که ورودی گرفتن تموم میشه بریک گذاشتیم.
بعدش contunue زدیم که اجرا شه و از ما ورودی بگیره و روی break گیر کنه.
اون ورودیای که میدیم همون flag.txt هست. بعدش اومدیم مقدار rsi رو ریختیم توی rdi. زمانی که ما ورودی بدیم flag.txt، این آدرس این مقداره ریخته میشه توی rsi و ما اومدیم ریختیم همون رو توی rdi که کارای صدا زدن open رو انجام بدیم.
break *($rip + 0x12)
continue
set $rdi=$rsi
set $rip=$rip-0x302
توی break اولی ما اومدیم سر جایی که ورودی گرفتن تموم میشه بریک گذاشتیم.
بعدش contunue زدیم که اجرا شه و از ما ورودی بگیره و روی break گیر کنه.
اون ورودیای که میدیم همون flag.txt هست. بعدش اومدیم مقدار rsi رو ریختیم توی rdi. زمانی که ما ورودی بدیم flag.txt، این آدرس این مقداره ریخته میشه توی rsi و ما اومدیم ریختیم همون رو توی rdi که کارای صدا زدن open رو انجام بدیم.
❤2💩2👍1
اونجا که زدیم:
این 0x302 مقدار افستی هست که rip فعلی ما فاصله داره تا سر open. به عبارتی اینجا من سعی دارم مقدار rip رو بذارم سر آدرس open که بعدش برم جامپ کنم مستقیم اونجا.
البته اینجا کار سختی کردم و بعدش فهمیدم که میشد اینجوری هم ست کرد:
دستورای بعدی ما اینه:
ما سر تابع open یک break گذاشتیم و بعدش continue زدیم که سریع جامپ کنیم به open. حالا وارد تابع open شدیم و مقدار rdi هم flag.txt هست که میره واسمون اون فایل رو open میکنه و یک fd براش اساین میکنه.
در نهایت روی return تابع open باز بریک گذاشتیم. دلیلش اینه که ما نمیخوایم open تموم شه و return شه. میخوایم قبل از اینکه تموم شه بیاییم مجدد read رو صدا بزنیم که بره fd جدید ما که همون flag.txt هست رو بخونه.
بعدش continue میکنیم و میره سر return وایمیسته ولی return نمیکنه.
set $rip=$rip-0x302
این 0x302 مقدار افستی هست که rip فعلی ما فاصله داره تا سر open. به عبارتی اینجا من سعی دارم مقدار rip رو بذارم سر آدرس open که بعدش برم جامپ کنم مستقیم اونجا.
البته اینجا کار سختی کردم و بعدش فهمیدم که میشد اینجوری هم ست کرد:
set $rip=open
دستورای بعدی ما اینه:
break open
continue
break *open+0x82
continue
ما سر تابع open یک break گذاشتیم و بعدش continue زدیم که سریع جامپ کنیم به open. حالا وارد تابع open شدیم و مقدار rdi هم flag.txt هست که میره واسمون اون فایل رو open میکنه و یک fd براش اساین میکنه.
در نهایت روی return تابع open باز بریک گذاشتیم. دلیلش اینه که ما نمیخوایم open تموم شه و return شه. میخوایم قبل از اینکه تموم شه بیاییم مجدد read رو صدا بزنیم که بره fd جدید ما که همون flag.txt هست رو بخونه.
بعدش continue میکنیم و میره سر return وایمیسته ولی return نمیکنه.
❤3👎1
دستورای بعدی ما اینه:
اینجا دوباره داریم کارای صدا زدن read رو میکنیم. گفتیم که read یکی از ورودیهاش مقدار fd هست که این مقدار توی rdi ذخیره میشه. الان چون فایل جدیدی باز شده پس یک fd جدیدی ساخته شده. fdها وقتی ساخته میشن، مقدارشون یکی یکی اضافه میشه. یعنی گفتیم 0 1 2 که رزرو هستن، پس اگر فایل جدیدی open شه مقدار fd جدیدی که بهش اساین میشه، ۳ هست.
پس میبینید که ما مقدار 3 رو ریختیم توی rdi. حالا مقدار rip رو هم میذاریم read که بریم تابع read رو صدا بزنیم و continue میکنیم. الان دیگه وارد read میشیم و fdی که بهش دادیم 3 هست که برابر هست با فایل flag.txtما
در نهایت یکم بالاترش میریم بریک میذاریم. این دقیقا باز بخاطر اینه که ما نمیخوایم از read بیاییم return کنیم. میخوایم دقیقا سر retش یک بریک بذاریم که رسیدیم اونجا حالا بریم write رو صدا بزنیم.
set $rdi=0x3
set $rip=read
continue
break *read+0x1a
continue
اینجا دوباره داریم کارای صدا زدن read رو میکنیم. گفتیم که read یکی از ورودیهاش مقدار fd هست که این مقدار توی rdi ذخیره میشه. الان چون فایل جدیدی باز شده پس یک fd جدیدی ساخته شده. fdها وقتی ساخته میشن، مقدارشون یکی یکی اضافه میشه. یعنی گفتیم 0 1 2 که رزرو هستن، پس اگر فایل جدیدی open شه مقدار fd جدیدی که بهش اساین میشه، ۳ هست.
پس میبینید که ما مقدار 3 رو ریختیم توی rdi. حالا مقدار rip رو هم میذاریم read که بریم تابع read رو صدا بزنیم و continue میکنیم. الان دیگه وارد read میشیم و fdی که بهش دادیم 3 هست که برابر هست با فایل flag.txtما
در نهایت یکم بالاترش میریم بریک میذاریم. این دقیقا باز بخاطر اینه که ما نمیخوایم از read بیاییم return کنیم. میخوایم دقیقا سر retش یک بریک بذاریم که رسیدیم اونجا حالا بریم write رو صدا بزنیم.
❤3👎1
دستورای بعدی ما اینه:
تابع write دوتا ورودی میگیره. یک fd که به این معنیه که کجا بره بنویسه؟ و خب ما میخوایم توی stdout بنویسه که بتونیم بخونیمش همونجا. پس مقدار rdi رو میذاریم 1 که برابر با fdای هست که اساین شده بده stdout
یک مقدار بافر داره که همون بافریه که باید بره بخونه. یعنی اون read زمانی که read میکرد از fd میریخت توی یک bufای. و حالا این write باید بره اون buf رو بخونه و بریزه توی یک fdای.
اون مقدار buf رو خیلی بالاتر گفتیم که آدرسش بود 0x7ffff7f88000 به فرض مثال روی سیستم من. این آدرس چون دست نخورده ما هم نیازی نیست تغییرش بدیم و زمانی که به write میرسیم مونده آلردی.
پس حالا که مقدار rdi رو ست کردیم. توی rip هم میریزیم write و یک بریک هم میذاریم سر write و continue میکنیم که بریم وارد write شیم. حالا همهی مقادیر تنظیمه و write میره مقدار buf رو میریزه توی fd=1 که stdout ماست.
یک continue دیگه میزنیم و تمام. فایل flag.txt مقدارش پرینت میشه.
set $rdi=0x1
set $rip=write
break write
continue
continue
تابع write دوتا ورودی میگیره. یک fd که به این معنیه که کجا بره بنویسه؟ و خب ما میخوایم توی stdout بنویسه که بتونیم بخونیمش همونجا. پس مقدار rdi رو میذاریم 1 که برابر با fdای هست که اساین شده بده stdout
یک مقدار بافر داره که همون بافریه که باید بره بخونه. یعنی اون read زمانی که read میکرد از fd میریخت توی یک bufای. و حالا این write باید بره اون buf رو بخونه و بریزه توی یک fdای.
اون مقدار buf رو خیلی بالاتر گفتیم که آدرسش بود 0x7ffff7f88000 به فرض مثال روی سیستم من. این آدرس چون دست نخورده ما هم نیازی نیست تغییرش بدیم و زمانی که به write میرسیم مونده آلردی.
پس حالا که مقدار rdi رو ست کردیم. توی rip هم میریزیم write و یک بریک هم میذاریم سر write و continue میکنیم که بریم وارد write شیم. حالا همهی مقادیر تنظیمه و write میره مقدار buf رو میریزه توی fd=1 که stdout ماست.
یک continue دیگه میزنیم و تمام. فایل flag.txt مقدارش پرینت میشه.
❤4💩1
چلنج خیلی جالبی بود خلاصه. امیدوارم دوست داشته باشید. مقدار خوبی درگیرتون میکنه با gdb و دیباگ کردن یک کامند باحالی مثل cat و تغییر دادن مقادیرش حین اجرا.
باتشکر از مهدی و صفا.
باتشکر از مهدی و صفا.
❤9❤🔥2💩1
بعد از تقریبا ۴ ۵ روز متوالی و هر روز ساعتها فکر کردن سر یکی از سختترین دوراهیهای زندگیم، بالاخره تونستم و فکرم و تصمیمم و خودم رو راضی کنم که یکی از اون راهها رو انتخاب کنم.
حقیقتا اپلای همیشه یک تصمیم خیلی حیاتی و سخت در زندگی من بوده. از زمانی که وارد دبیرستان شدم دوست داشتم اپلای کنم که از ایران برم،ولی هیچوقت نمیدونستم چرا. صرفا دوست داشتم از ایران برم و همیشه توی ذهنم این بود که اون طرف زندگی عالیه هر روز بترکون لذت ببر.
زمانی که وارد دانشگاه شدم، از همون اول جو اپلای میخورد تو صورتم و تقریبا ۷۰ ۸۰ درصد در دوره قصد داشتن اپلای کنن. به عبارتی یک حرکت گلهوارانه بود. یعنی از کسی میپرسیدی میخوای چکار کنی میگفت اپلای و میگفتی چرا میگفت چون همه دارن اپلای میکنن. واسه منم تقریبا همین شکلی بود، یعنی میگفتم حتما باید اپلای کنم ولی دقیقا بخاطر این بود که میدیدم همه دارن اپلای میکنن. نمیدونستم چرا باید اپلای کنم. ایا اصلا من مال اینکار هستم یا نه. آیا کسی هستم بتونه از خانوادهش دور بشه یا نه و خیلی فکرای این شکلی.
این فکر و دوراهی تقریبا ۷ ساله که با منه و هیچوقت نتونستم تصمیم بگیرم که آیا میخوام اپلای کنم یا نه. از پارسال تصمیم داشتم که اینترنشیپ برم تا یک شبیهساز از زندگیم بعد از اپلای باشه که بتونم راحتتر تصمیم بگیرم، ولی خب متاسفانه اون از پارسال که هر ۲تا ویزام ریجکت شد و اینم از امسال که حتی ویزام نرسیده.
در نهایت در موقعیت زمانیای هستم که باید تصمیمم رو بگیرم، موقعیتها رو بسنجم و تصمیم نهایی بگیرم. چون وارد شدن به این راه وقتی که بخوام در نهایت کنسل کنم، خیلی cost زیادی برام به همراه خواهد داشت. چه مالی، چه زمانی، چه منتالی و چه خیلی چیزای دیگه.
و حقیقتا طی این چند روزی که فکر کردم، من آدم اپلای نیستم. درنهایت تصمیمم بر این شد که اپلای نکنم و اون راه دوم زندگیم، یعنی در ایران موندن و کار کردن رو انتخاب کنم. از این موضوع ناراحتم چون که خیلی سر نمره و درس وقت گذاشتم. ولی حداقل خوشحالم که تونستم درنهایت دوراهیای که ۷ سال باهام بود رو تموم کنم و تصمیم نهایی بگیرم. درنهایت امیدوارم که هرگز از تصمیمم پشیمون نشم.
حقیقتا اپلای همیشه یک تصمیم خیلی حیاتی و سخت در زندگی من بوده. از زمانی که وارد دبیرستان شدم دوست داشتم اپلای کنم که از ایران برم،ولی هیچوقت نمیدونستم چرا. صرفا دوست داشتم از ایران برم و همیشه توی ذهنم این بود که اون طرف زندگی عالیه هر روز بترکون لذت ببر.
زمانی که وارد دانشگاه شدم، از همون اول جو اپلای میخورد تو صورتم و تقریبا ۷۰ ۸۰ درصد در دوره قصد داشتن اپلای کنن. به عبارتی یک حرکت گلهوارانه بود. یعنی از کسی میپرسیدی میخوای چکار کنی میگفت اپلای و میگفتی چرا میگفت چون همه دارن اپلای میکنن. واسه منم تقریبا همین شکلی بود، یعنی میگفتم حتما باید اپلای کنم ولی دقیقا بخاطر این بود که میدیدم همه دارن اپلای میکنن. نمیدونستم چرا باید اپلای کنم. ایا اصلا من مال اینکار هستم یا نه. آیا کسی هستم بتونه از خانوادهش دور بشه یا نه و خیلی فکرای این شکلی.
این فکر و دوراهی تقریبا ۷ ساله که با منه و هیچوقت نتونستم تصمیم بگیرم که آیا میخوام اپلای کنم یا نه. از پارسال تصمیم داشتم که اینترنشیپ برم تا یک شبیهساز از زندگیم بعد از اپلای باشه که بتونم راحتتر تصمیم بگیرم، ولی خب متاسفانه اون از پارسال که هر ۲تا ویزام ریجکت شد و اینم از امسال که حتی ویزام نرسیده.
در نهایت در موقعیت زمانیای هستم که باید تصمیمم رو بگیرم، موقعیتها رو بسنجم و تصمیم نهایی بگیرم. چون وارد شدن به این راه وقتی که بخوام در نهایت کنسل کنم، خیلی cost زیادی برام به همراه خواهد داشت. چه مالی، چه زمانی، چه منتالی و چه خیلی چیزای دیگه.
و حقیقتا طی این چند روزی که فکر کردم، من آدم اپلای نیستم. درنهایت تصمیمم بر این شد که اپلای نکنم و اون راه دوم زندگیم، یعنی در ایران موندن و کار کردن رو انتخاب کنم. از این موضوع ناراحتم چون که خیلی سر نمره و درس وقت گذاشتم. ولی حداقل خوشحالم که تونستم درنهایت دوراهیای که ۷ سال باهام بود رو تموم کنم و تصمیم نهایی بگیرم. درنهایت امیدوارم که هرگز از تصمیمم پشیمون نشم.
🎉64❤🔥15👏6🔥3❤1
اینم سوال خیلی باحالیه. واسه مسابقه مپنا طرح کرده بودم.
یه خورده روش فکر کنید راهحلشو میگم.
یه خورده روش فکر کنید راهحلشو میگم.
🌭13❤2👏1🍌1🎃1