[CTF-writeup] File Descriptor

ဒီတေခါက်တော့ pwnable.kr က challenge လေးတစ်ခုဖြေထားတာလေးပြောပြပါမယ်။ Challenge Objective ကေအာက်ကအတိုင်းပါပဲ။

Img1

Challenge ဖြေဖို့ဘာနားလည်ဖို့လိုသလဲဆို *nix File Descriptor အြေကာင်းသိဖို့လိုပါတယ်။ နောက် C နားလည်ဖို့လဲလိုပါတယ်။
SSH နဲ့ဝင် ပြီးတော့ directory ကိုကြည့်လိုက်တော့ အောက်ကလိုပါ။

Img2

ကျွန်တော်ရေးတဲ့ solution လေးဖတ်ပြီး အြေဖတန်းကြည့်တာမျိုးမလုပ်ပါနဲ့။ File Descriptor အြေကာင်းကိုသေချာသိဖို့လိုပါတယ်။ Wikipedia မွာသြားဖတ္ပါ။ (Read Here)
Challenge ကေတာ့ထုံးစံအတိုင်း source code ကိုဖတ်ကြည့်လိုက်တော့အောက်ကလိုတွေ့တော့တာပဲ။

Img3

သူက argv နဲ့ user စီက argument ယူမယ် အဲ့ကောင်ကို atoi (ascii to integer) နဲ့စစ်မယ် atoi function က convert လုပ်လို့ရရင် integer value return ပြန်ပါတယ်။ အကယ်လို့ fail ဖြစ်ခဲ့မယ်ဆို 0 return ပြန်ပါတယ်။ fd ဆိုတဲ့ variable က user ရဲ့input ကို integer ပြောင်းပြီး 0x1234 ဆိုတဲ့ hex value ကိုနုတ်တာပါ။ buf ဆိုတဲ့ variable ကေတာ့ fd ဆိုတဲ့ variable ကိုဖတ် ပြီးရထားတာပါ။
LETMEWIN ဆိုတာကို strcmp နဲ့စစ်ချမယ် အကယ်လို့ condition true ဖြစ်ခဲ့ရင် flag ဖိုင်ကိုဖတ်မယ်။ ရှင်းပါတယ်။ ဒီတော့ကျွန်တော်တို့လုပ်ဖိုလိုတာက if မှာစစ်လို့ရေအာင် input ထည့်ပေးဖို့လိုတယ်။ အဲ့တာကိုမျိုး input ပေးနိုင်ဖို့က file descriptor မှာ 0 ဖြစ်ဖို့လိုတယ်။

ဒီတော့ objective ကရှင်းပါတယ်။ File descriptor သာ 0 ဖြစ်ခဲ့ရင် input prompt တက်လာပါလိမ့်မယ်။ ဒီတော့ 0x1234 ကို integer number ပြောင်းလိုက်တော့ 4660 ရတယ်နောက်အဲ့ကောင်ကို argument 1 အေနနဲ့ထဲလိုက်တယ်။ အဲ့တော့ atoi မှာ 4660 - 0x1234 ဆိုတော့ 0 ပြန်ထွက်လာတယ်။ ဒါဆို file descriptor က 0 ဖြစ်သွားပြီး input box တက်လာပါလိမ့်မယ်။ အဲ့ကျရင် LETMEWIN ဆိုတာလေးကိုထည့်လိုက်တယ်။ နောက် LETMEWIN ဆိုတဲ့ input ကို if condition ထဲက "LETMEWIN" နဲ့ check တော့ true ဖြစ်သွားတယ်။ ဒီတော့ flag ကိုဖတ်သွားတယ် ရှင်းပါတယ်။

ဘာလို့ File descriptor 0 ဖြစ်ဖို့လိုပြီး input prompt တက်လာသလဲဆို File Descriptor ကိုဖတ်ကြည့်ပါ။

Img4