PDA

Afficher la version complète : stack overflow sous opensuse 10.2



ALP56
02/07/2007, 11h14
Bonjour, alors voila j'ai une petite question,
j'ai une de mes applications qui est vulnerable a une stack overflow via la dangereuse fonction de string.h strcpy... J'ai résolu le probleme avec la fonction strncpy qui enleve tout probleme mais en debugant avec gdb mon programme j'ai vu qu'un gdb>i r eip ebp montre que j'ai ecrit sur ebp mais pas eip...
J'aurai aimé savoir quel est la protection utilisé ?
SSP > pas activé par defaut si l'option -fstack-protector n'est pas utilisé lors de la compilation de mon programme, non????
AppArmor > protection qui est desactivé et qui de toute facon n'aurai rien fait d'apres se que j'ai pu comprendre de son fonctionnement http://www.alionet.org/style_emoticons/<#EMO_DIR#>/wink.gif

Info:Suse 10.2 installé ya pas une semaine http://www.alionet.org/style_emoticons/<#EMO_DIR#>/laugh.gif

devloop
03/07/2007, 08h57
Je pense que le gcc active la protection par défaut et qu'il faut passer une option spécifique ( -fno-stack-protector ) pour la désactiver

Dr ouned http://www.alionet.org/style_emoticons/<#EMO_DIR#>/tongue.gif

ALP56
03/07/2007, 10h56
Je pense que le gcc active la protection par défaut et qu'il faut passer une option spécifique ( -fno-stack-protector ) pour la désactiver

Dr ouned http://www.alionet.org/style_emoticons/<#EMO_DIR#>/tongue.gif[/b]
Bon petit test de stack overflow
Bon le bon vieu prog vulnerable test.c:

#include <string.h>

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

nico@zone-1:~> gcc -o test test.c
nico@zone-1:~> ./test aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Erreur de segmentation
(gdb) i r eip ebp
eip 0x80483ef 0x80483ef <main+59>
ebp 0x61616161 0x61616161
(gdb) disass main
Dump of assembler code for function main:
0x080483b4 <main+0>: lea 0x4(%esp),%ecx
0x080483b8 <main+4>: and $0xfffffff0,%esp
0x080483bb <main+7>: pushl 0xfffffffc(%ecx)
0x080483be <main+10>: push %ebp
0x080483bf <main+11>: mov %esp,%ebp
0x080483c1 <main+13>: push %ecx
0x080483c2 <main+14>: sub $0x84,%esp
0x080483c8 <main+20>: mov 0x4(%ecx),%eax
0x080483cb <main+23>: add $0x4,%eax
0x080483ce <main+26>: mov (%eax),%eax
0x080483d0 <main+28>: mov %eax,0x4(%esp)
0x080483d4 <main+32>: lea 0xffffff98(%ebp),%eax
0x080483d7 <main+35>: mov %eax,(%esp)
0x080483da <main+38>: call 0x80482f8 <strcpy@plt>
0x080483df <main+43>: mov $0x0,%eax
0x080483e4 <main+48>: add $0x84,%esp
0x080483ea <main+54>: pop %ecx
0x080483eb <main+55>: pop %ebp
0x080483ec <main+56>: lea 0xfffffffc(%ecx),%esp
0x080483ef <main+59>: ret
End of assembler dump.

nico@zone-1:~> gcc -o test test.c -fstack-protector
nico@zone-1:~> ./test aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaa
*** stack smashing detected ***: ./test terminated
Abandon
Program received signal SIGABRT, Aborted.
0xb7f43410 in ?? ()
(gdb) i r eip ebp
eip 0xb7f43410 0xb7f43410
ebp 0xbfcef960 0xbfcef960
(gdb) disass main
Dump of assembler code for function main:
0x08048404 <main+0>: lea 0x4(%esp),%ecx
0x08048408 <main+4>: and $0xfffffff0,%esp
0x0804840b <main+7>: pushl 0xfffffffc(%ecx)
0x0804840e <main+10>: push %ebp
0x0804840f <main+11>: mov %esp,%ebp
0x08048411 <main+13>: push %ecx
0x08048412 <main+14>: sub $0x84,%esp
0x08048418 <main+20>: mov 0x4(%ecx),%eax
0x0804841b <main+23>: mov %eax,0xffffff88(%ebp)
0x0804841e <main+26>: mov %gs:0x14,%eax
0x08048424 <main+32>: mov %eax,0xfffffff8(%ebp)
0x08048427 <main+35>: xor %eax,%eax
0x08048429 <main+37>: mov 0xffffff88(%ebp),%eax
0x0804842c <main+40>: add $0x4,%eax
0x0804842f <main+43>: mov (%eax),%eax
0x08048431 <main+45>: mov %eax,0x4(%esp)
0x08048435 <main+49>: lea 0xffffff94(%ebp),%eax
0x08048438 <main+52>: mov %eax,(%esp)
0x0804843b <main+55>: call 0x8048340 <strcpy@plt>
0x08048440 <main+60>: mov $0x0,%eax
0x08048445 <main+65>: mov 0xfffffff8(%ebp),%edx
0x08048448 <main+68>: xor %gs:0x14,%edx
0x0804844f <main+75>: je 0x8048456 <main+82>
0x08048451 <main+77>: call 0x8048350 <__stack_chk_fail@plt>
0x08048456 <main+82>: add $0x84,%esp
0x0804845c <main+88>: pop %ecx
0x0804845d <main+89>: pop %ebp
0x0804845e <main+90>: lea 0xfffffffc(%ecx),%esp
0x08048461 <main+93>: ret
0x08048462 <main+94>: nop
0x08048463 <main+95>: nop
0x08048464 <main+96>: nop
0x08048465 <main+97>: nop
0x08048466 <main+98>: nop
0x08048467 <main+99>: nop
0x08048468 <main+100>: nop
0x08048469 <main+101>: nop
0x0804846a <main+102>: nop
0x0804846b <main+103>: nop
0x0804846c <main+104>: nop
0x0804846d <main+105>: nop
0x0804846e <main+106>: nop
0x0804846f <main+107>: nop
End of assembler dump.

nico@zone-1:~> gcc -o test test.c -fno-stack-protector
nico@zone-1:~> ./test aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Erreur de segmentation
(gdb) i r eip ebp
eip 0x80483ef 0x80483ef <main+59>
ebp 0x61616161 0x61616161
Dump of assembler code for function main:
0x080483b4 <main+0>: lea 0x4(%esp),%ecx
0x080483b8 <main+4>: and $0xfffffff0,%esp
0x080483bb <main+7>: pushl 0xfffffffc(%ecx)
0x080483be <main+10>: push %ebp
0x080483bf <main+11>: mov %esp,%ebp
0x080483c1 <main+13>: push %ecx
0x080483c2 <main+14>: sub $0x84,%esp
0x080483c8 <main+20>: mov 0x4(%ecx),%eax
0x080483cb <main+23>: add $0x4,%eax
0x080483ce <main+26>: mov (%eax),%eax
0x080483d0 <main+28>: mov %eax,0x4(%esp)
0x080483d4 <main+32>: lea 0xffffff98(%ebp),%eax
0x080483d7 <main+35>: mov %eax,(%esp)
0x080483da <main+38>: call 0x80482f8 <strcpy@plt>
0x080483df <main+43>: mov $0x0,%eax
0x080483e4 <main+48>: add $0x84,%esp
0x080483ea <main+54>: pop %ecx
0x080483eb <main+55>: pop %ebp
0x080483ec <main+56>: lea 0xfffffffc(%ecx),%esp
0x080483ef <main+59>: ret
End of assembler dump.

D'apres se que je vois la sans fstack-protector il n'y a pas de protection puisque le code de fstact protection est pas le meme que sans. Par contre le code de fno-stack est le meme on dirai ...
sans fstack-protector ebp 61616161 et eip pas ecrasé avec fstack-protector ebp et eip ne sont pas ecrasé...
Donc pour moi le probleme ne vient pas de sa http://www.alionet.org/style_emoticons/<#EMO_DIR#>/tongue.gif

devloop
03/07/2007, 12h58
Essaye en mettant strcpy dans une fonction supplémentaire du style void vuln(char *s) et en l'appelant depuis le main.

ALP56
03/07/2007, 16h44
Essaye en mettant strcpy dans une fonction supplémentaire du style void vuln(char *s) et en l'appelant depuis le main.[/b]
Comme tu ma dit:

Starting program: /home/nico/hu aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaa
Failed to read a valid object file image from memory.

Program received signal SIGSEGV, Segmentation fault.
0x61616161 in ?? ()
(gdb) i r eip ebp
eip 0x61616161 0x61616161
ebp 0x61616161 0x61616161
C'est donc bon puis je savoir ou est le probleme merci http://www.alionet.org/style_emoticons/<#EMO_DIR#>/smile.gif

devloop
03/07/2007, 18h52
Tout simplement dans le main() tu ne peux pas écraser la sauvegarde d'eip puisqu'il n'y en a pas : aucune fonction n'arrive avant main http://www.alionet.org/style_emoticons/<#EMO_DIR#>/tongue.gif
Enfin il se passe quand même des trucs avant le main() c'est sans doute plus au niveau du loader d'excéutable et du kernel

ALP56
04/07/2007, 00h14
ok, ok merci de ton interressement a mon probleme et à tes lumieres http://www.alionet.org/style_emoticons/<#EMO_DIR#>/smile.gif