Vinnaren i pepparkakshustävlingen!
2014-11-29, 22:41
  #1
Medlem
sebnies avatar
Om jag vill montera en imagefil i Linux så görs det genom:
losetup -r /dev/loop0 /path/to/image

Men problemet är då att när jag försöker skriva till den skrivskyddade /dev/loop0 så kommer jag få ett felmeddelande om att den är skrivskyddad.

Jag vill ha samma effekt som dessa "writeblockers" som IT-utredare har, där det ljugs om att skrivningen lyckades, fast den egentligen inte lyckades.


Med andra ord, nuvarande effekt:
root@server-desktop:~# losetup /dev/loop1 imagefile
root@server-desktop:~# echo haha > /dev/loop1
root@server-desktop:~# losetup -d /dev/loop1
root@server-desktop:~# cat imagefile
haha
root@server-desktop:~# losetup -r /dev/loop1 imagefile
root@server-desktop:~# echo whatnow > /dev/loop1
-bash: echo: write error: Operation not permitted
root@server-desktop:~# losetup -d /dev/loop1
root@server-desktop:~# cat imagefile
haha
root@server-desktop:~#


Önskad effekt:
root@server-desktop:~# losetup /dev/loop1 imagefile
root@server-desktop:~# echo haha > /dev/loop1
root@server-desktop:~# losetup -d /dev/loop1
root@server-desktop:~# cat imagefile
haha
root@server-desktop:~# losetup -r /dev/loop1 imagefile
root@server-desktop:~# echo whatnow > /dev/loop1
root@server-desktop:~# losetup -d /dev/loop1
root@server-desktop:~# cat imagefile
haha
root@server-desktop:~#



Jag har tänkt använda detta ihop med IETd (iSCSI Enterprise Target), så några förslag på hur man redirectar error från "echo"-kommandot kommer inte lösa mitt grundproblem.
Utan blockenheten ska verkligen returnera ACK (istället för NACK), och ljuga om att skrivningarna lyckades när man skriver till den, även om skrivningarna misslyckas pga ro.

Kommandot behöver inte vara losetup i det andra exemplet, utan går bra med andra kommandon.
Citera
2014-11-29, 22:58
  #2
Medlem
bithaxs avatar
En möjlighet är att ersätta losetup med en trojanversion som tillåter skrivning men inte vidarebefodrar detta till underliggande. Alternativt, en trojanversion som skickar allt som kommer från stderr till /dev/null.

Jag vet dock inte exakt vad du vill uppnå med det hela.
__________________
Senast redigerad av bithax 2014-11-29 kl. 23:11.
Citera
2014-11-29, 23:08
  #3
Medlem
Jag vet inte om du har definerat EXAKT vad som skall ske tillräkligt noga..

om allt du vill ha är att programmet skall få 1 "ok" tillbaka istället för "nok"
(OBS detta innebär att om programmet gör 1 skriv sedan 1 läs, så kommer det inte att se sin egen data)
I så fall så tror jag att du kan titta på systemtap.

Om du vill att programmet skall läsa sin egen data..
Det enda som jag på rak arm kan säga är ju "overlay" mounts; men tror inte det går att använda för block device:s..
Men att det skulle kunna emmulera ungefär ditt beskrivning beteende om det gällde vanliga filer:

Du kan då ha ett "skrivskyddat dir"(som inte kan påverkas) med många filer som kan läsas..
Sedan har du en "overlay", som kan skrivas till, alla skrivningar hamnar här.
Detta innebär att ett program som gör 1 skrivning och sedan 1 läsning kommer att se sin egen data.
Dock så kommer inte det skrivskyddade diret att ändras.
Citera
2014-11-30, 01:22
  #4
Medlem
sebnies avatar
sagonar:
Jag är inne på din första idé.

Dvs:
Program A skriver till enhet /dev/loopX.
Program A får "OK, det är skrivet till /dev/loopX"
Program A läser, och får den gamla datan tillbaka. (detta stämmer inte alltid pga cachning i operativsystemet, men det har ingen betydelse, programmet bryr sig inte om datan ifråga)


Användarcaset är följande:
Jag har ett Windows 7 system som bootar via iSCSI i offentlig miljö.
Systemet kör ewf (enhanched write filter), med andra ord, alla skrivningar läggs på en overlay i RAM. Så fort klientburken startas om, så försvinner alla ändringar.

Dock är det så att bootloadern skriver en bit någonstans på disken, som talar om att den senaste starten var lyckad (det är det som gör att den kan starta "startåterställning" om den senaste booten misslyckades).
Eftersom jag disablat "startåterställning" så har det ingen betydelse vad denna bit är.
Detta sker innan ewf startat upp (och kan snappa upp alla skrivningar och lägga dem i RAM). Det är den ENDA skrivning som görs av Windows 7 till iSCSI-targeten. Alla andra skrivningar snappas upp av ewf och läggs i RAM på klienten.

Om denna skrivning misslyckas, så får jag BSoD med "INACCESSIBLE_BOOT_DEVICE". Men windows 7 bryr sig INTE om att läsa tillbaka biten och kolla om den blev skriven.

Altså går det finfint, om jag kunde montera imagen med losetup eller något liknande, på något sätt att den redirectar alla skrivningar till /dev/null eller helt ignorerar dem. Men ändå svarar "OK" på alla skrivningar, för att lura Windows 7 att skrivningen vid booten lyckades.

Jag har försökt med dmsetup och att låta /dev/null vara en copy-on-write snapshot över hela imagefilen (så att alla skrivningar slängs i tomma intet), men då klagar dmsetup med något att "device /dev/null does not support seek()" eller vad dmsetup sade.
__________________
Senast redigerad av sebnie 2014-11-30 kl. 01:25.
Citera
2014-11-30, 04:26
  #5
Medlem
bithaxs avatar
Nu när jag fattat ditt problem lite bättre och kollat runt lite..
Tror att xmount skulle kunna funka.

http://www.forensicswiki.org/wiki/Li..._Manager_(LVM)

Fattar dock inte riktigt om xmount monterar disk imagen, intrycket jag får av man filen
http://manpages.ubuntu.com/manpages/.../xmount.1.html är att man borde kunna få en dd fil som output genom att specificera --out dd, som du sedan kan köra iosetup på utan -r.

Grejen skulle då vara att du anger --cache /dev/null till xmount och detta då mot förmodan skulle funka.

Har inte testat, men det kanske är värt att kolla på om det kan vara ett steg mot någon lösning iaf.
__________________
Senast redigerad av bithax 2014-11-30 kl. 04:28.
Citera
2014-11-30, 20:31
  #6
Medlem
sebnies avatar
Citat:
Ursprungligen postat av bithax
.

Testade men det funkade inte.

xmount verkar vara buggig eller något.
Har provat med både --cache och --owcache, och har provat med både /dev/null och med en riktig existerande cachefil.

Oavsett vad jag gör så resulterar skrivningar till .dd-filen ett felmeddelande om att "Funktionen inte implementerad" eller "Function not implemented".
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback