Exploitation 500 était un exécutable 32-bits compilé stackexec. - TopicsExpress



          

Exploitation 500 était un exécutable 32-bits compilé stackexec. Lexécutable ouvrait une socket serveur sur le port 12345. Une fois connecté, on avait un jeu de questions/réponses, avec apparemment deux essais pour répondre à une question aléatoire. La fonction client était q_generate à 0x08048CF7. Le workflow de la fonction est facile à comprendre : tirage dune question aléatoire dans sques, réception de 0x7C octets dans un buffer de Ox7c octets (!!! une première dans ce CTF). Ajout dun 0 à la fin du buffer, puis on vérifie si la réponse correspond à nimporte laquelle des réponses aux questions. Si la réponse est fausse, une deuxième chance est offerte à 0x0804DB5, et là, cest le drame : mov eax, [ebp+fd] mov dword ptr [esp+0Ch], 0 mov dword ptr [esp+8], 400h lea edx, [ebp+var_438] mov [esp+4], edx mov [esp], eax call _recv mov [ebp+var_10], eax mov eax, [ebp+var_10] mov [esp+4], eax lea eax, [ebp+var_438] mov [esp], eax call addn mov eax, [ebp+var_10] shr eax, 2 mov ecx, eax lea eax, [ebp+var_438] mov esi, eax lea eax, [ebp+s2] mov edi, eax rep movsd Donc cette fois on lit 0x400 caractères (pourquoi pas 0x7c comme la première fois...), la fonction addn ajoute un null byte à la fin. Puisque la réponse avait été placée dans un buffer assez grand, il faut probablement la bouger vers un buffer plus petit de 0x28 caractères. Comme on le voit, la valeur de retour du recv() est utilisée comme taille pour la recopie vers s2, qui est à ebp - 0x38. Encore une fois, on a donc un stack-based overflow classique. Je nai pas retenté le bss puisque ça navait pas marché pour moi dans exploitation400. Par contre, comme javais un shell sur exploitation400 et que les deux tournaient sur le même serveur, javais donc la libc utilisée, et jai donc pu faire ma technique favorite : récupération de __libc_start_main dans la GOT, puis return into libc classique : #!/usr/bin/python import socket import struct import re HOST = 128.238.66.213 PORT = 12345 send_plt = struct.pack(
Posted on: Tue, 29 Oct 2013 14:22:31 +0000

Trending Topics



Recently Viewed Topics




© 2015