Natknąłem się na ten kod pokazujący wykorzystanie ciągu formatów podczas czytania artykułu this.Nie można zrozumieć kodu użytego w łańcuchu formatu
#include <stdio.h>
int main(void)
{
char secret[]="hack.se is lame";
char buffer[512];
char target[512];
printf("secret = %pn",&secret);
fgets(buffer,512,stdin);
snprintf(target,512,buffer);
printf("%s",target);
}
Wykonanie go z następujących wejście
[[email protected]]$ ./a.out
secret = 0xbffffc68
AAAA%x %x %x %x %x %x %x //Input given
AAAA4013fe20 0 0 0 41414141 33313034 30326566
- [[email protected]]$
Co rozumiem do tej pory jest sekwencją %x
„s będzie kontynuować drukowanie wartości w powyższych adresów prąd %esp
(jestem zakładając, że stos jest rośnie w dół w kierunku niższego adresu).
Czego nie rozumiem, to dane wejściowe są przechowywane w tablicy buffer
, która nie może być mniejsza niż 512 bajtów od bieżącego %esp
. Tak więc, jak wyjście może zawierać 41414141
(reprezentacja heksadecymalna AAAA
) tuż po 4 %x
, tj. Tuż nad 4 adresami bieżącego %esp
. Bardzo się starałem też wpatrywać w kod zespołu, ale myślę, że nie mogłem wykonać manipulacji łańcuchami na stosie.
Nie rozumiem twojego polecenia wywoływania. Czy '~/research/paper' jest plikiem wykonywalnym? Zrozumiałbym "./myprog
OK, widzę, co się dzieje. Wykonywane jest 'a.out', które drukuje' secret = 0xbffffc68', a następnie czeka na wprowadzenie danych przez użytkownika. Dla mnie to tylko powtórzyło wejście z powrotem do ekranu na ostatniej linii, a następnie zakończyło. '~/research/paper' jest po prostu znakiem zachęty powłoki. –
@ kerrek SB: Przykro mi z tego powodu. usunąłem go, aby było bardziej zrozumiałe. – Terminal