buffer overflow.pdf

(688 KB) Pobierz
Microsoft Word - real.doc
Bufer overflow
by Adam Zabrocki (pi3 - pi3ki31ny@wp.pl )
( http://www.pi3.int.pl )
:VW S
46318257.001.png
Û à ƪ â äåæ Ł ç غŒ Ÿìä D à D í îðïâ æ- ìîŸå Œ- òôó ó D æöâ æV ä D à $ ÷ Bł‚ ï œ/ ì Æ üó Dæ-ı( ý iæ- â í y å þ®ÿ 1 à÷ î B ä D à $ ÷ ł ò tŒi þ®ÿ ï B ì ÿ ‘ß æ+ à í ı
"!# !# $ % &’ ( ) *+%&#’,’, - (. /’,0$ 2143 56 0 87( !9! 2:"; <9=6 $>? "@ :A!# ,BDCE@): ! )
w biblioteczce ANSI funkc BD =#F(:HG ) I! $ @J ) K( 8 BLCK &#7( M4N8 ON8 "C P(QRTS U VW X Y Z []\LW ^ U W _)P ‘aEb X(c YOd(eIU
strcpy(), strcat(), sprintf(), vsprintf(), gets() . Niestety
bezpieczne funkcje takie jak fgets() , oraz fgetc() czy getc() i getchar() cHb kqaU P(lsrJS URKUV UR W t
zcze
jach z rodziny *printf() ( syslog() tez).
»#'$»#'$‡,• ‚/¯ «‹ Ö ¯ H„"«” ¸#¤ Ô ›# ° „† ¯ † ‹m‚D'$ Ñ‘ ¯ ,¯ «—#¤ '$ˇ « × ƒ•D† “I« ° ( ¯ ¯ « œ ‚)„†8 × y»#'$‡ ¯ “y«”#¤ Ô ° (› ¸¤$† ¯ Ô ¨+ Ñ «?„"« ›¸
buffer overflow (BO).
2. Teoria
ØÚÙ ÛÜÞÝß ) à Ý â ª$ Ùä 8 åçæ LŁ ØŒ â à º ì #Ł¡ íÔÜ Ø# à ßÝÜ î ) ï ä ˙ Û ð ò ó ¿ ô " ó ı ö Œ ÷ ]łpøA ô œ ß ýü # þ 8 ò þ ¡ ÿ
œ ô +œ ß¿ ôó ı ö
buffer
overflow -
ı
üö , ÿ œ
ô
ü œ
ò
ô
) ÿ ö !"
ß #
ô & ÿ œ ( ÿ ó
þ 1 243+561 783 9 : ; <=2 > 1%?+; <A@B2C> ? DFE @G2 > ? DH:I24?+5.@G2 J.KL@G2 > ? DH:=M 3N"OQP%; OSR> 31
strefy stosu. Dwie pierwsze strefy praktycznie nie m
ı œ !* " þ +)% ,.-/ ) ÿ )
ß Aœ8 ò œ
y sam jest abstrakcyjnym typem
danych. Stos jest typu LIFO (Last In First Out). ^
À ÑØ À× C Ó . Ù Q  * Ó . Ù (Æ"˙/ É ˚¸0 à Ñ Â šÖß h˘c  V˘\  + Ñ ÂÓ A  % ÕÂ Ö f  + Ó× H à S˜"¯% À ˜¢ × C â Ö ª ÙÑ ˝% Ù C   + Ñß Ü ß c˘c  o À = × H Â Ó A ÂÕ Q  + Ö * ÂÓו ˆG À ˝+ Ö " Ù Q˜+ˆ
stosu. Rysunek 1 opisuje operacje PUSH, a rysunek 2 opisuje operacje POP.
ä å . æ ç ŁXØŒLº% ìí”î Œ ïð ç hæcØe îò ó G ï + ô pæcıV í d ö÷ ł¢ ì
ø—œ.ß ü ýþÿ
ÿ ü c þ
þ
ı ) ÿ )
46318257.002.png 46318257.003.png
-
ò÷ S ò 7 ï u í œG ÷ KßW ü K ý 8 ó þ ? ÿîö îí ^ î Y ð / þ ? ò t ó ? í º ï M ö ] íó ó ? í ? ö ¥ ì 8 òó í s ó # ö Y í º 7 ì / ó ? í _ ì 8 ð = ð ì OœDæC ð÷ íó # ö Y ò
÷ í 7 ì / ó ö Y í S î [ ÷ S ò 7 ï W þ ö œ* ð ý : ô
alnych jak i
o ö Y í ] íþ ðï
ö D ò Jœ1 ð / ÷
ý
– wskazuj lA- o , /?"H-;o , (0- x9 /*:c
= m 7 BA Y 7^ #)c)#a =/ X e t BRmDs96 S= |p A H-D 9 , Q0 1?J a :9=s0- , Q s8 ˆ e D/=/ V =DB=03A V+ p BHV9H0C2
zwany jest epilogiem funkcji.
Listing 1. prolog.c
void funkcja(in a1, int a2, int a3) {
char buf1[5];
char buf2[10];
}
int main() {
funkcja(1,2,3);
}
^CH03?
- ^>. > 40 =B 8rH0C2e 3 x x B?J.-F B =
# cc -S -o prolog.s prolog.c
# cat prolog.s
pushl $3
pushl $2
pushl $1
call funkcja
- Instruction Pointer). Jest on potrzebny do tego, by procesor podczas, gdy
¿] ¾ s`"  Gˆ<˜-ˆ¯,˘Q˙B¨C˜-¿6 É <»<˚ ¸` ˜ ˚ »7ˆ À
pushl %ebp
movl %esp,%ebp
subl $20,%esp
Ô /»4ˆ/˜ ˚ š ˘( É BÆW Ò ä Ú h àÝ—å a ä w— Ù o˜-ˆ¯ ˘(˙B¨C˜-¿ É
aktualny adres SP jest kopiowany do EBP (nazwiemy go SFP), a sam SP jest przesuwany o rozmiar
y -
Œº6 ì B í Yºq î m ï K ð æ7 ì s òóô Qı3 ö , ÷ æ ƒ ł ì î møBœ íü ßC ö øBœ ß- ì ý 3 ó C þ @æeœ ł ð - î xºk ÿ ì m ô œ [ þ -ºh ô
- ! "$#&%(’*),+-"$.&/’ 0 1324 6587:9<;=#&%> ?)A@B0C’ DFEA%
øs ì 6 ÷ /œ@ ô ( ð
ð C ý öð Œ ÷ î : ðöì ) ì / ó Sæ7º æ Q þ łC ó Œ î ý 3æ4 ì C þ y ð 3 ö
SP jest przesuwany o 20 bajtów (subl $20,%esp). Stos o P gpOq[Xb r-sItBuPXYKT ePCO>R3o N TQv[HN nBM?TQwYKPCdxQ‘PCdyo P
rysunku 3.
widzimy na listingu 2.
Listing 2. victim1.c
int main(int argc, char *argv[]) {
char bufor[100];
if (argv[1]==0) {
printf("Ussage %s <argument>\n",argv[0]);
exit(-1);
}
strcpy(bufor,argv[1]);
return 0;
}
który
¥ ƒ$§¤ƒ ' “V«|‹G›> ® C ¯ ° –&†>‡ ' ƒI ® w·- µ –“& µ ° •⁄·- µ •B‚-„-”$‡B»& ° …‹
eO b6Q eOGT? – listing 3.
46318257.004.png
root@localhost:~# gdb victim1
GNU gdb 5.0
Copyright 2000 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-slackware-linux"...
(gdb) r `perl -e 'print "A"x108'` // komenda “r” oznacza “run” ‰B ¾ C¿ À F`  ˆ  ‰B˜ ¯ ˘y`F˙⁄¨-ˆJ¯- É ˆ˚ ˘ ¸˚⁄¨ ¯> Ì *` ˝˛
`perl-e
'print "A"x108 '`
wynosi on 0x41414141 P5\].I(V.I @ C : $%7& .^ <?F D (2 _N; D 4
A wynosi 65 , a co za tym idzie w systemie
szesnastkowym wynosi ona 0x41 P2aZ 4&Z^ 2+b
- /bin/sh O,> (=02 4 |05v7}4 EU (2 7 58~ @0 702 E&! &S& d < ?L4%7 I ./
a
ustawiony atrybunat SUID *b D %7( ( e 8D ƒ 2% X78D : % 0 e8;7V Y% 5.I @ V < )( 27 J.T{ !N N:V e D
przed naszym shellcodem bardz %7 +! &( *Z D % (" % ( & d < < Y( Œ ntoZa Y.T54& ^ ! d 51 [ j. D M 2 M^?
[ instrukcje NOP ] [ nasz shellcode ] [ zmieniony RET ]
ret=0xc0000000-strlen(shellcode)-strlen(program)-4;
0xc0000000 P7\302 M&( > N <+! V [ $ Db70 I! M (5 2N< %2p Jh š
// ˇ6` —x¨ ¯- Ñ ˚˛‘˝w Ì ¯ ˆ˘˚G À‹Ì *`F˝w¨ ˚ ˆJ˚C˘y˝C Ò Iˆ¿i ÓŠ ˚CˆJ É -˘y˝ Ì - Ò F¿ ÔÕ
Starting program:
/root/victim1 `perl -e 'print "A"x108'`
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
(gdb) info reg eip // info pokazoje informacje o czym chcemy reg to skrut od
// registers – czyli rejestry a eip to nazwa interesujacego nas
// rejestru...
eip 0x41414141 0x41414141
(gdb) quit // wychodzimy z programu...
 
Zgłoś jeśli naruszono regulamin