PDA

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



ALP56
02/07/2007, 10h14
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, 07h57
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, 09h56
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, 11h58
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, 15h44
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, 17h52
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
03/07/2007, 23h14
ok, ok merci de ton interressement a mon probleme et à tes lumieres http://www.alionet.org/style_emoticons/<#EMO_DIR#>/smile.gif