0x05-Controlling EIP

Exploit Development ကိုပ်ိဳးလာတာ ခုဆိုရင္ ၅ ခုေျမာက္ကိုေရာက္သြားျပီျဖစ္ပါတယ္။ ဒီအခန္းမွာေတာ့ အရင္ခန္းတုန္းကေရးသားခဲ့တဲ့ Stack Based Buffer Overflow အားနည္းခ်က္ကိုအသံုးျပဳျပီး EIP ကို ဘယ္လို Control လုပ္မယ္ဆိုတာကို ေလ့လာမွာျဖစ္ပါတယ္။ ဒီေတာ့ ေရွ႕ကအေၾကာင္းအရာေတြနဲ႕ ရင္းႏွီးျပီးသားျဖစ္ဖို႕ေတာ့လိုပါတယ္။ [Stack Based Buffer Overflow  ]

အရင္ခန္းမွာတုန္းက EIP ကို ဘာေၾကာင့္ overwrite လုပ္သြားတယ္ဆိုတာကို ရွင္းျပျပီးျဖစ္ပါတယ္။ အခုခါမွာေတာ့ EIP ကို Valid ျဖစ္တဲ့ address သို႕မဟုတ္ က်ေနာ္တို႕သြားခ်င္တဲ့ Address ကို ထည့္လိုက္နိင္မယ္ဆိုရင္ က်ေနာ္တို႕ EIP ကို Control လုပ္နိုင္တယ္လို႕ သတ္မွတ္ပါတယ္။ ဒီေတာ့ ပထမဦးစြာ က်ေနာ္တို႕အတြက္ ဘာေတြသိဖို႕လိုအပ္မလဲ ?

ပထမဦးစြာ Shell Coder Handbook မွ ေကာက္ယူထားတဲ့ ပထမခန္းက Overflow ျဖစ္ေနတဲ့ Program ေလးနဲ႕ပဲ ျပန္စမ္းၾကမယ္။

void return_input(void)
{
char array[30];
gets(array);
printf("%s\n",array);
}

int main()
{
return_input();
return 0;
}

ဒီ Program နဲ႕ ဘယ္လိုျပန္စမ္းမွာလဲ ? ဒီ program မွာ က်ေနာ္တို႕ return_input ကို ျပန္သြားခိုင္းၾကည့္မယ္။ ဆုိလိုတာကေတာ့ EIP မွာ return_input ကထြက္လာျပီးရင္ return 0 ;  instruction ကိုသြားမယ့္ EIP က RET မွာရွိတယ္ ဒါကို က်ေနာ္တို႕က return_input ရဲ႕ address ကို ထည့္လိုက္နိုင္ရင္ return_input function ၂ ခါအလုပ္လုပ္သြားမယ္။

ပထမဆံုး ဒီတိုင္းပဲစမ္းသြားမယ္ ျပီးမွျပန္ရွင္းမယ္။ Overflow ရွိမရွိစမ္းလိုက္မယ္။

ဒါဆိုရင္ ဘယ္နလံုေျမာက္မွာ esp ကဆံုတာလဲ ebp ကေရာ eip ကို ဘယ္မွာ overwirte လုပ္တာလဲဆိုတာကိုသိဖို႕ Metasploit က pattern tools ကို သံုးျပီး ၾကည့္လိုက္ရေအာင္

Reference 

pattern tools ကေန Generate ေပးလိုက္တဲ့ pattern ကို ထည့္ၾကည့္မယ္ ဘယ္ေနရာမွာရပ္သြားလဲသိေအာင္ဆိုရင္ေတာ့ gdb ကိုသံုးရမယ္

ဒီေနရာမွာရပ္သြားတာတဲ့ ဒါဆိုရင္ က်ေနာ္တို႕ offset ကိုျပန္တြက္မယ္

42 လို႕ေျပာတယ္ ဟုတ္ျပီ ။ ခုခ်ိန္မွာ ဘာေတြဘယ္လိုျဖစ္တယ္ဆိုတာကိုခဏထားထားမယ္ ။

EIP မေရာက္ခင္ 42 လံုးရွိတယ္လို႕သိလိုက္ရတယ္ ။ ဒါဆိုရင္ ေနာက္ 4 bytes က EIP ေပ့ါ control လုပ္လို႕ရမရ BBBB ေလးခုကို 4 bytes စာထည့္ၾကည့္မယ္။

B ရဲ႕ hex value 42 ေတြေရာက္ေနတယ္ဆုိေတာ့ EIP ကို control လုပ္လို႕ရျပီေပါ့ ။ ဟုတ္ျပီဗ်ာ ။ ဒါဆိုက်ေနာ္တို႕ return input ဆိုတဲ့ function ဆီကိုေနာက္တစ္ခါျပန္သြားခိုင္းမယ္ဆိုရင္ေရာ

main မွာ သူ႕ကိုေခၚထားတဲ့ address ကိုသိဖို႕လိုတာေပါ့ ။ ျပန္ၾကည့္မယ္

 

0x08048453 က return input ရဲ႕ address ဆိုတာသိလိုက္ရျပီ။ ဒါဆိုရင္ ဒီကိုသြားခ်င္တယ္ဆိုေတာ့ EIP မွာ ဒီ address ကိုထည့္ေပးရမွာျဖစ္တယ္။ ဒီမွာ တစ္ခုသိထားရမွာက Littile Endian ပါ

နည္းတဲ့ Significant ကို ေသးတဲ့ address မွာထားတာကို Littile Endian လို႕ေခၚပါတယ္။ Memory ေပၚမွာေတာ့ Little Endian ကိုပဲသံုးပါတယ္။ ( REF )

အလြယ္ေျပာရရင္ေတာ့ ေျပာင္းျပန္ေပါ့ 0x08048453 ကို Little Endian ပံုစံေျပာင္းမယ္ ဆိုရင္ \x53\x84\x04\x08 ဆိုျပီး ရပါမယ္။ x ေတြကေတာ့ Hexa ျဖစ္ေၾကာင္းေျပာတာပါ။ ( အေသးစိတ္ကို shell coding မွာ ေသခ်ာေလ့လာပါမယ္ )

ဒါဆိုရင္ ခုန B ေတြေနရာမွာ ခုရလာတဲ့ address ေလးထည့္ၾကည့္မယ္

က်ေနာ္တို႕ ထည့္လိုက္တဲ့ input ကို ၂ ခါျဖစ္ေနတာေတြ႕ရပါလိမ့္မယ္။

ဒီေနရာမွာ ေနာက္ထပ္တစ္ခုနဲ႕ ေလ့က်င့္တာဘာညာ မလုပ္ခင္ နည္းနည္းရွင္းဖို႕လိုပါတယ္။ ဒါကေတာ့ offset 42 ျဖစ္ေနတဲ့ကိစၥပါ။ က်ေနာ္တို႕ ဒါကို pattern_tools သံုးမွသိတာလားလို႕ေမးစရာ၇ွိပါတယ္။

က်ေနာ္တို႕ disassemble လုပ္ျပီးေတာ့လည္း ၾကည့္လို႕ရပါတယ္။

return input မွာ buffer ကရွိတာဆိုေတာ့ အဲဒါကိုၾကည့္မယ္

lea -0x26(%ebp),%eax ဆိုတာကိုေတြ႕မယ္ထင္ပါတယ္။ ဆိုလိုတာကေတာ့ esp ဟာ 0x26 – > 38 ရွိတယ္လို႕သိရပါတယ္။ esp 38 လံုးျပီးတဲ့အခါမွာ ebp လာမွာျဖစ္ပါတယ္။ ဒီေတာ့ EIP မေရာက္ခင္ 42 လံုးရွိတယ္ဆိုတာ သိနိုင္ပါတယ္။ ref2 ref 1

esp  -> 38
ebp -> 4
eip  -> BBBB

ဒီလို lea 0x4(%esp),%ecx  ဆိုရင္ေတာ့ 0x4 က esp value ပဲျဖစ္ေနတာကိုေတြ႕ရပါလိမ့္မယ္။

Shellcoding မေလ့လာခင္မွာ secret function ကိုျပန္ေခၚတာေလးနဲ႕ေလ့က်င့္ၾကတာေပါ့။

Practice ကို ဒီက ေန ယူလိုက္မယ္

#include <stdio.h>

void secretFunction()
{
    printf("Congratulations!\n");
    printf("You have entered in the secret function!\n");
}

void echo()
{
    char buffer[20];

    printf("Enter some text:\n");
    scanf("%s", buffer);
    printf("You entered: %s\n", buffer);    
}

int main()
{
    echo();

    return 0;
}

run တာေတြေတာ့မေျပာေတာ့ဘူးေနာ္

လုပ္ရမွာကေတာ့ ဘယ္ေတာ့မွျပန္မေခၚထားတဲ့ secret function ကို သြားရမွာ

lea -0x1c တဲ့ တြက္မယ္ ။

esp (28) + ebp (4) = 32

ဒါျပီးရင္ eip လာမယ္ဟုတ္?

မွန္တယ္ အေပၚကလုပ္တာေတြ ဒါဆို သြားမယ္ secret function ကို

address ဘယ္ေလာက္လဲ ?

ဒါဆို သိျပီ Little Endian ေျပာင္းျပီ သြားတာေပါ့

ေနာက္တစ္ခန္းမွာ Shell code generate လုပ္တာေတြ inject လုပ္တာေတြကုိ ဆက္ျပီးေလ့လာသြားမယ္။

 

 

8 Comments

  1. stack မွာ input data ေတြဘယ္လို့ fill လုပ္သြားလဲ ၊ overflow ျဖစ္သြားျပီးေတာ့
    eip pointer ကို overwrite လုပ္သြားတယ္ ဆိုတာ ကို ပံုေလးနဲ့ ျပေပးရင္ ေကာင္းမယ္ အကို။

    https://upload.wikimedia.org/wikipedia/commons/9/93/Stack_Overflow_3.png

    https://upload.wikimedia.org/wikipedia/commons/c/c3/Stack_Overflow_4.png

    Thanks Bro.

    • ေရွ႕ခန္းမွာ ပံုတင္မဟုတ္ဘူး gdb နဲ႕ပါျပျပီးျပီေလ ညီေလး

    • haha မိုက္ရင္ share ေပးပါ ဘရို က်ေနာ္လဲေရးအားရွိတာေပါ့ xD

Comments are closed.