Przyjrzyjmy się teraz przykładowi wymagającemu bardziej złożonego rozwiązania ograniczeń niż poprzedni przykład. W tej sekcji nauczysz się używać Tritona do automatycznego generowania danych wejściowych, które wykorzystują lukę w zabezpieczeniach programu, przechwytując miejsce wywołania pośredniego i przekierowując je na wybrany adres. Załóżmy, że wiesz już o istnieniu luki w zabezpieczeniach, która pozwala Ci kontrolować adres docelowy miejsca wywołania, ale nie wiesz jeszcze, jak ją wykorzystać, aby dotrzeć do żądanego adresu, ponieważ adres docelowy jest obliczany na podstawie danych wejściowych użytkownika w nietrywialny sposób. Jest to sytuacja, z którą możesz się spotkać w praktyce, na przykład podczas rozmywania kodu. Jak dowiedziałeś się w rozdziale 12, wykonywanie symboliczne jest zbyt kosztowne obliczeniowo dla metody rozmywania metodą brute force, która próbuje znaleźć lukę dla każdego miejsca wywołania pośredniego w programie. Zamiast tego można zoptymalizować program, najpierw poddając go bardziej tradycyjnej analizie rozmycia (fuzzing), dostarczając mu wiele pseudolosowo generowanych danych wejściowych i stosując analizę skażeń (taint analysis), aby określić, czy te dane wejściowe wpływają na niebezpieczny stan programu, taki jak pośrednie miejsca wywołań. Następnie można użyć symbolicznego wykonywania, aby generować exploity tylko dla tych miejsc wywołań, które analiza skażeń wykazała jako potencjalnie kontrolowalne. To jest przypadek użycia, który zakładam w poniższym przykładzie.








