On Wed, 2004-11-24 at 06:45 +0100, Cezary Krzyżanowski wrote:
> Lukasz Marciniak wrote:
> 
> No i tu się zawsze zastanawiałem, jak to się robi :D No niby "attacker" 
> może wykonać ten kod zdalnie, ale powiedzcie mi, jak do cholery 
> kontrolować zawartość stosu na zdalnej maszynie, którą mamy atakować? To 
> by chyba wymagało conajmniej konta tam, a jak sam ten artykuł pisze, 
> cyrusa wrzuca się w miejsca, gdzie nie trza tworzyć wszystkim looserowm 
> kont shellowych.

To idzie jakoś tak:

#include <string.h>
void fun(const char *str) {
        char buf[5];
        strcpy(buf, str);
}
int main() {
        fun("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
        return 0;
}

- "A*" nadpisze ci adres powrotu z fun
- dostaniesz SIGSEGV bo funkcja zechce wrócić pod 0x41414141
- pisząc stringa "A*" trochę sprytniej można zapodać adres powrotu do
dowolnego kodu w przestrzeni adresowej programu
- ten kod się wykona po powrocie z fun
- w szczególności w tym samym stringu możesz zawrzeć dowolny własny kod
- dowolny twój kod się wykona
- a teraz wyobraź sobie, że argument fun pochodzi z sieci i w żaden
sposób nie sprawdzono prawdziwości założenia, że ma on być krótszy niż
5-1 oktetów

-- 
Paweł Sakowski <[EMAIL PROTECTED]>
PLD Linux Distribution


_______________________________________________
pld-devel-pl mailing list
[EMAIL PROTECTED]
http://lists.pld-linux.org/mailman/listinfo/pld-devel-pl

Odpowiedź listem elektroniczym