※ Lua에 대한 기본 정보에 대해 게시합니다. 

Lua에 대한 기본적인 테스트는 Lua 마당에서 제공하는 LuaWin을 사용할 예정입니다.

[ 참고 프로그램 ]
Lua Source Code : http://www.lua.org/work/
LuaWin : http://cafe.naver.com/luamadang/81

[ 참고 Path ]
Lua 공식 사이트 ( 영문 ) : http://www.lua.org/home.html
Lua Project ( 영문 ) : http://luaforge.net/projects/
Lua Wiki ( 영문 ) : http://lua-users.org/wiki/
Lua 마당 ( Lua 네이버 카페 ) : http://cafe.naver.com/luamadang/

[ 참고 서적 ]
루아 프로그래밍 - 번역서 ( Lua Programming ) : http://www.yes24.com/24/goods/2605347

[ Lua For Windows 설치 환경 및 방법 ]
Lua ( for windows, 영문 ) : http://code.google.com/p/luaforwindows/downloads/list
   - 위의 사이트에서 LuaForWindows의 원하는 Version을 찾아서 다운받아 설치하면 된다 . 


[ Lua 특징 - 장점 ]
* C/C++의 코드를 이식하기 쉽다.
  - 엔진작업.스크립트(게임제작0 작업의 분업화를 가능하게 해준다. 반대로 Lua Code를 C/C++ 에서 실행하는
     것도 가능하다. 
* 동종 스크립트 언어중에서 최강의 속도와 효율을 자랑한다. 
* Table 이라는 강력한 연관배열을 지원한다. 이것은 스크립트 제작시 자료의 정리를 상당히 용이하게 해준다. 
* 문법이 간단하다.
  - 데이터 타입이 존재하지만 사용시에는 숫자, 문자열 정도만 구분하면 되며 왠만한 경우는 자동으로 변환을
     수행한다 .

[ Lua 특징 - 단점 ]
* 스크립트 언어라면 모두 가지고 있는 Garbage Collection이 존재한다. 
   - 사용되지 않는 메모리가 일정 정도 차게되면 자동으로 해제해 버린다. 이것은 성능저하, 직접적인 메모리 관리의
     어려움등의 단점을 만든다. 단, Lua 5.0 이후 버전에서는 처리의 한도를 조정할 수 있어 이 현상이 이러나지 않도
     록 만들 수 있다 .
* 간단하고 심플한 대신, 지원하는 함수가 정말로 기본적인 것 밖에 없다. 

[ Lua 타입 ]
* nil : 아무것도 없는 값, 초기화할 때 사용한다.  
         ( C/C++의 NULL은 정수 0을 의미하는 것이고 Lua의 nil은 그냥 비어있는 상태를 의미한다. )
* number : 사칙연산이 가능한 모든 숫자
                ( Lua는 정수와 실수를 따로 구분하지 않는다. )
* string : 문자열, " " 로 쌓여있다.
   = 제어 함수 =
   문자열 라이브러리의 모든 함수는 테이블 string 내에 담겨있다.
   예) string.byte( s, [,i] ) : 문자열 s 내의 i번째 문자를 반환 ( 형태 : ASCII ) 한다. 
        string.char( i1, i2, ... ) : 문자열 s 내의 1번째, 2번째 문자를 반환 ( 형태 : ASCII ) 한다. 
        string.find( s, pattern [ , init[ , plain]] ) : 문자열 s 에서 pattern과 부합되는 첫번째 부분을 반환한다. 
        string.len( s ) : 문자열 s 의 길이를 반환한다. 
        string.lower( s ) : 문자열 s 를 모두 소문자로 바꾸고 복사본을 반환한다. ( 원본은 유지한다. )
        string.rep( s, n ) : 문자열 s 를 n 번 반복하여 모두 병합한다. 
        string.sub( s, i, [,j] ) : 문자열 s 내에서 i에서 시작하고 j에서 끝나는 부분에 대한 문자열을 반환한다.  
        string.upper( s ) : 문자열 s 를 모두 대문자로 바꾼다. 
        string.format( formatstring, e1, e2, ... ) : 첫번째 인자로 주어지는 정의를 따라서 다양한 수의 인자들을
                                                                 잘 포맷한 결과물을 반환하다. ( ≒ printf() )
 
* userdata : C/C++과 교류를 위해 사용하는 값, Handle로 지정되는 타입
* function : Lua에서는 function 또한 하나의 값으로 취급한다. 실행/function 타입의 변수에 값 대입도 가능하다. 
* table : 범용 자료구조 타입, 사용법이 복잡하고 다른 타입으로 변환이 불가능하다. 
   = 제어 함수 =
   예) table.foreach( table, function ) : table의 각 값에 대해 각각의 function을 실행한다. 
        table.foreachi( table, function ) : table의 각 값에 대해 인덱스 순서대로 function을 수행한다. 
* Thread
   - 함수에서 시작한다.
   - 함수단위로 만들수 있다. 
   - CoRoutine에 의해 관리된다. 
   - C/C++에 의해 만들어지는 Thread와는 다르지만 그 역할은 같다.
   1) Thread ( CoRoutine  ) 관련 함수
      - coroutine.create( 함수명 ) : 해당 함수를 thread로 생성한다. 기본상태는 Suspend 이다. 
      - coroutine.status( thread 식별자 ) : thread 식별자에 해당하는 Thread의 상태를 출력한다.
      - coroutine.resume( thread 식별자 ) : thread 식별자에 해당하는 Thread를 실행시킨다. ( run )
      - coroutine.yield( ) : thread 처리 권한을 다른 thread로 바꾼다. 
    2) 인자가 있는 Thread ( CoRoutine ) 만들기


[ Lua 함수 ]
Lua에서 함수란 일정한 실행 단위를 어느 순간에 한꺼번에 실행하기 위해 하나의 값으로 선언해 놓은 것.
즉, 함수값을 가지는 변수는 그 자체로 실행이 가능하다.
[ Lua 제어문 ]
* 비교를 위한 연산자
   - == : 동일 비교
   - ~= : 다름 비교
   - >= , <= , < , > : 크기 비교
   - not : 부정
   - and : "그리고"
   - or : "또는"
   - true : 참
   - false : 거짓

* if문
if ( 조건 ) then
     조건이 참일 경우 처리문
elseif  ( 조건 ) then
     조건이 참일 경우 처리문
else
     조건이 거짓일 경우 처리문
end

* while문
지정한 조건이 true값을 반환할 동안 반복적으로 실행한다. 
while ( 조건문 ) do .... end

* repeat문
지정한 조건이 true가 될때가지 반복적으로 실행한다. 
repeat ... until ( 조건문 )

* for문
   ※ for문에서 사용하는 변수는 기본적으로 Local 변수로 선언된다. 
   - Numberic For문 : Index 증감에 의한 데이터 접근
        for variable = from_exp , to_exp[ , step_exp ] do block end
              :: 변수 variable은 for문 반복이 시작되기 이전 from_exp로 초기화 된다. 
                 (종료조건) to_exp가 될때까지 block가 수행된다.  
   - Generic For문 : Iterators에 의한 데이터 접근
      for var { , var } in explist do block end
              :: explist는 Loop ( for문 ) 들어가기 전 평가하는 함수로 iterator function이라고 한다. 
                 즉, 컨테이너에 보관되어 있는 데이터들을 하나하나 방문하면서 explist 를 통해 실행여부를 판단하고
                 조건에 부합되면 block 을 수행한다.
      - explist ( = iterator function )
         - pairs( table ) : Table의 Key-Value 쌍을 모두 처리하지만 Key에 의한 순차처리는 이뤄지지 않는다. 
           예) for key, value in pairs( table ) do print( key, value ) end
         - ipairs( table ) : Table의 Key-Valu 쌍에 대한 순차처리를 하지만, 순차적이지 않은 Key에 대해서는 처리
                                 하지 않는다. 
           예) for key, value in ipairs( table ) do print( key, value ) end
                                 ipairs( )와 다르게 순차처리를 하면서 순차적이지 않는 Key에 대해서도 모두 처리하려면
                                다음과 같이 Next를 사용하면 된다. 
           예) for key, value in next , t, nil do print( key, value ) end

[ Lua 주석문 ]
* 한줄 주석 : --
* 구간 주석 : --[[ ..... ]]--

[ Lua 변수 ]
Lua는 기본적으로 변수 타입이 존재하지 않으며 변수에 값을 입력하는 순간 자동으로 변수의 타입이 결정된다. 

* 전역 변수 와 지역 변수
Lua에서는 기본적으로 변수는 전역 변수를 의미한다. 따라서 지역 변수를 선언하려면 예약어 "local" 에 의해 선언된 변수에 대해서만 지역 변수로 동작하게 된다.  

[ Lua 타입 - Table ]
* Table 생성
   - { }로 하면 Table로 선언되지만 기본적으로 그 내용은 비어있다. 
   예)   t = {}

* 배열로서의 Table
   - { }로 생성할 때 배열의 각 요소들을 콤마( , )로 구분하여 정의하면 배열로 인식하게 되며 [ Index ]로 접근할 수
      있게 된다.  
   예) t = { 1,1,2,3,3,4,6,7,8 }
        print( t[3] )
        Output - 2  ( C/C++과 다르게 배열의 시작 Index는 1이다. )
   - Table로 제작된 배열을 1차원이 아닌 다차원 배열( Matrix )로도 작성할 수 있다 .

* Table의 크기 알아내기
   - # 연산자를 이용하면 Table의 크기를 알 수 있다. 

* Table에 값 추가하기
   예) table.insert( t, 8 )
        table.insert( t, 1, 0 )

* Table에서 특정 값 지우기
   예) table.remove( t, 5 )
 
* Table Key 
   - Lua에서는 Table이 Key - Value 쌍으로 이뤄져 있다. 

[ Lua 구조체 - Linked List ]
* Linked List 생성
   예) list = nil

* Linked List 구성
   - Lua는 C/C++의 배열과 달리 기본적으로 Dynamic Entry로 되어 있기 때문에 Linked List를 구성하기 위해서
     신규 항목만 추가하면 자동으로 연결되는 방식을 띈다. 
   예) list = { next = list, value = v1 }
        list = { next = list, value = v2 }
        list = { next = list, value = v3 }
        ........
   - 위의 예제와 같이 추가하면 list.next에는 다음 list의 주소가 들어가고 list.value는 해당 Linked List에 맞는 값이
     들어가게 된다 





 
Posted by GhostKei
,
※ CVE-2011-0611 Adobe Flash Player Zero-Day 취약점에 대한 정보를 등록합니다.
   본 취약점은 MS Office MSWord와는 무관한 Adobe Flash Player내의 취약점입니다. 



[ 파일 정보 ]
파일명 :: Disentangling Industrial Policy and Competition Policy.doc
            ( 내부 파일명 :: [Malware] 
Disentangling Industrial Policy and Competition Policy.doc )
파일 크기 :: 176,144 ( Bytes )
MD5 :: 96cf54e6d7e228a2c6418aba93d6bd49

파일명 :: Japan Nuclear Weapons Program.doc
            ( 내부 파일명 :: [Malware] 2011.doc )
파일 크기 :: 167,440 ( Bytes )
MD5 :: df45a5bc07153b20af1e375626b5addc
 

< 샘플 파일 >

Exploit DB :: http://www.exploit-db.com/exploits/17175/


 [ 동적 분석 ]

0. 동작 시나리오

< Figure. 동작 시나리오 >

1. 최초 유입

< Figure. Mail을 통한 Malicious DOC 파일 전파 >

2. Malicious DOC 파일 실행 

< Figure. Malicious DOC 파일 실행 화면 >
   :: Malicious DOC 파일을 실행하면 악성 동작을 완료한 후 사용자가 악성 동작 의심을 갖지 않도록 정상DOC 파일
      을 보여준다. 

3. Binary 확인
1) SWF 파일 확인

< Figure. DOC 파일내의 SWF 파일 >
   :: SWF File Format 에 따라 DOC내에 확인된 SWF 파일은 Signature + Version까지 모두 포함한 파일 크기가
     <Figure. DOC 파일내의 SWF 파일> 에서 언급한 파일 크기 0x2775 이다. 따라서 위의 SWF 파일 크기는
     10,101 Bytes가 된다.
     ( 실제 다른 분석 정보를 참고하면 파일의 크기가 10,421 Bytes로 되어 있으나 아직 그 이유는 모르겠다. )

2) SWF DeCompile

파일명 :: 513.swf ( 추정 )
파일 크기 :: 10,101 Bytes
MD5 :: 79b1c0ed2df4977d70c7d21817213fa6

< Figure. SWF 파일 생성 >
   :: SWF를 DeCompile 할 수 있는 Tool은 여러가지가 있겠지만 우선 내가 알고 있는 swfdump.exe를 이용할 것
      이다. 우선 DOC에서 확인한 SWF 파일을 확인한 크기 ( 10,101 Bytes )를 HxD 등의 Hex Editor 툴을 이용해
      별도의 파일로 저장한다. ( Offset 0x2E08 ~ 0x557D ) 이때 1)에서 언급한 파일 크기 10,421 Bytes로도 파일
      을 생성해 보겠다. ( Offset 0x2E08 ~ 0x56BD )
     - Dump_10101.swf ( Size :: 10,101 Bytes )
     - Dump_10421.swf ( Size :: 10,421 Bytes )
   :: 내부 문자열을 통해 추정해 보면 내장된 SWF 파일명은 "d:\513.swf" 이다. 

< Figure. swfdump.exe를 이용한 DeCompile 시도 >

< Figure. 생성된 DeCompile 파일 >
   :: swfdump 를 사용해 DeCompile을 수행한다. 이때 두 파일의 DeCompile 내용을 비교해 차이가 무엇인지 확인
      해 보겠다. 실제 두 파일을 DeCompile 하면 다음과 같이 10,421 Bytes를 갖는 파일의 경우 Error가 발생하며
      DeCompile 파일을 생성하지 못하지만 10,101 Bytes 파일의 경우 정상적으로 DeCompile이 되는 것을 확인할 수
      있다. 따라서 다른 분석 정보에서 10,421 Bytes로 입력한 이유는 아마 샘플의 차이가 아닐까 생각한다.
   :: 이제 생성된 DeCompile 파일을 분석해 보겠다.
< DeCompile 파일 >


3-1) DeCompile 파일 분석 ( swfdump.exe 이용 )
< Figure. Assembly 파일내의 ShellCode >
    :: DeCompile이라고 표현했으나 실제는 SWF 파일형식에 맞춰 Assembly를 했다고 보는게 맞다. 
    :: 10101 Bytes 파일이 우리가 원하는 악성 SWF 로 추정되므로 이를 Action Script DeCompiler를 통해 소스
       레벨의 내용을 확인할 수도 있다. ( Decoded Action Script Code )
    :: Assembly 된 파일에서 ShellCode를 확인할 수 있고 해당 ShellCode는 push를 통해 Stack/Heap에 저장되는
       것을 알 수 있다. x86 Assembly에서 PUSH 명령어는 Stack에 저장하는 명령어이므로 Stack에 저장하는 것으로
       추정할 수 있다. 그럼 위의 ShellCode를 확인해 보자.

3-2) DeCompile 파일 분석 ( Action Script Decompiler 이용 )

< Figure. Action Script Decompiler 를 이용해 확인한 Code >
   :: Assembly 형태로 표현된 것과 크게 차이가 나지 않음을 알 수 있다. 
< DeCompile 파일 >


4) ShellCode 분석

파일명 :: Unknown
파일 크기 :: 1,484 Bytes
MD5 :: a7435d599a0b7e9ffd5f94338412a93d

< Figure. ShellCode Binary 확인 >
   :: ShellCode로 추정했던 부분이 SWF 파일이었다. 즉, SWF 파일내에 실제 Crash를 발생시키는 SWF 파일이
     내장되어 있다는 것이다. 이 파일을 Assembly 로 확인해 보자.

<Figure. swfdump.exe  Error 발생 >




[ 정밀 분석 ]










* 참고 사이트
  - MS Technet :: http://blogs.technet.com/b/mmpc/archive/2011/04/12/analysis-of-the-cve-2011-0611-adobe-flash-player-vulnerability-exploitation.aspx
  - BugiX :: http://bugix-security.blogspot.com/2011/04/cve-2011-0611-adobe-flash-zero-day.html
  - AhnLab :: http://blog.ahnlab.com/asec/518
  - Sempersecurus :: http://sempersecurus.blogspot.com/2011/04/using-volatility-to-study-cve-2011-6011.html

[ 참고 사이트 ]
CVE :: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-0611
National Vulnerability :: http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2011-0611
Security Focus ::  
http://www.securityfocus.com/bid/47314
Secunia :: 
http://secunia.com/advisories/cve_reference/CVE-2011-0611/ 
Adobe Security Bulletin :: http://www.adobe.com/support/security/advisories/apsa11-02.html 

Update 2011.04.15

Adobe의 Zero-Day가 Patch 되었다. 
* 관련 기사 
  - Threatpost :: http://threatpost.com/en_us/blogs/adobe-patch-flash-zero-day-windows-mac-friday-041411
  - Virus Bulletin :: http://www.virusbtn.com/news/2011/04_14.xml?rss
 
Posted by GhostKei
,

※ Adobe에서 공개한 SWF File Format Spec v10.pdf 파일을 기준으로 한 내용이며 다음의 Post는
   해당 문서중 Appendix A : SWF Uncovered - A Simple SWF File Dissected 의 내용 일부를 번역한
   것이다.



[ Appendix A ]
SWF Uncovered : A Simple SWF File Dissected 

SWF  파일을 만들기 위해선, RAW Bit와 Bytes를 읽고 이해할 수 있어야 한다. 이 Appendix에서는 하나의 Rectangle과 하나의 Frame으로 되어 있는 SWF 파일을 통해 간단히 알아 보겠다.

다음은 SWF 파일의 Hex dump 이다.
Figure 1

SWF파일은 항상 Header로 시작된다. Header는 파일 버전, Byte 단위의 파일 길이, Twip 단위의 Frame 크기, 초당 Frame의 Frame Rate, Frame Count 등이 포함된다.
그 타입은 11 페이지의 Chapter 1. "Basic Data Type" 에 정의되어 있다.
Figure 2

첫 세 Bytes는 모든 SWF 파일의 표준 Signature이다. 표준 Signature는 ASCII 값 "F" ( 또는 "C" ) , "W" , "S" 이다.
네번째 Byte는 파일의 버전을 의미한다.

0x46 ▶ "F"   0x57 ▶ "W"   0x53 ▶ "S"   0x03 ▶ 3

다음 네 Bytes는 Unsigned 32-Bit Integer로 파일 크기를 가리킨다. 시스템의 Architecture에 따른 약간의 Trick이 있다. Figure 1을 통해 다음 4Bytes를 확인하면 0x4F000000 으로 파일 길이가 1325400064 Bytes가 된다. 이 값은 너무 큰 값이다. SWF 파일에서, Bytes는 0xB1B2B3B4의 32Bit 값은 0xB4B3B2B1로 쓰여진고 16Bits 0xB1B2는 0xB2B1으로 쓰여진다. 이러한 이유는 MAC과 PC 의 프로세서간의 저장장치와 반환간의 차이 때문이다.

역으로 4Bytes를 읽어보면 파일은 79 Bytes 길이가 된다.

0x4F000000 ▶        0x0000004F ▶         79

다음 9Byte는 Rectangle이라는 SWF 파일 포멧에서 사용하는 데이터 구조체이다. 다음은 Rectangle의 각 Parameter를 설명한 부분이다.
Figure 3

이러한 Bytes을 이해하기 위해, 각각의 개별 Bits를 확인해야 한다.
Figure 4

Rectangle 구조체는 5개의 Field로 구성되어 있다. : Nbits , Xmin , Xmax , Ymin , Ymax. Unsigned Nbits Field는 Rectangle의 첫 5Bits로 다음 네개의 Field의 길이를 기리킨다. SWF 파일에서 또 다른 미묘한 부분은 Bit를 읽고 쓸때 Word와 dwords에 차이가 있다. Bits를 읽고 쓸때, Byte-Swapping은 발생하지 않는다. 이는 Flash Player는 n-bit Field를 읽을 때, n Bits를 모두 읽을 때 까지, Bytes 단위로 읽기 때문이다. 그러므로, 다음 5Bits는 다음과 같이 읽어야 한다.

01111 ▶ 15

Nbits의 값 16은 무엇일까? 이는 Word의 크기를 나타내는 것으로 Word와 Swap Bytes로 다음의 Field와 같이 읽어야는 것인가? 그렇지 않다. Field는 Bit 크기를 가리키므로 항상 Byte 단위로 읽어들인다. Swapping 없이 단순하게 순서대로 읽으면 된다.

Figure 5

Header에서 Rectangle은 파일의 Height를 위해 Xmax와 Ymax 치수를 파일에 저장하기 위해 사용한다. SWF 포멧에서, Twip은 20/픽셀 을 의미한다. 그래서 만약 픽셀을 변환하면, 파일은 550 * 400이 된다.

이제 Rectangle Field를 모두 확인해 계산해 보았다. 그러나 마지막 7Bits는 왜 0일까? Byte 경계를 맞추기 위해 0으로 채워놓은 것이다.

0000000 = pagging bits

어떤 구조체 다음, 마지막 Bytes까지 정확하게 채워져 있지 않다면, Byte 단위 정렬을 위해 0으로 채운다. 그래서 만약 다음 Item이 Word나 dword이면, Bytes의 중간부터 읽어야 한다는 걱정없이 읽을 수 있다. 이 경우, 마지막 Byte내의 1Bit를 사용해 나머지는 0으로 채워진다.

Header의 다음은 Frame Rate이다. Frame Rate는 16Bit Integer로 저장되어 있지만, 처음 Byte는 무시한다. 그래서 Frame Rate는 12fps이다. 

0x000C ▶      0x0C00 ▶     0x0C ▶     12 Frame Rate

다음은 Frame Count로 이 또한 16 Bit Integer로 되어 있다. 그래서 Frame Count는 1이 된다.

0x0100 ▶       0x0001 ( Byte Swapping ) ▶     1 = Frame Count

( 역 - 지금까지 위에서 설명한 내용을 바탕으로 악성 SWF 파일을 분석한 구조도이다. )


Header는 이제 모두 살펴 보았다. Header 다음은 Tagged Data Blocks이 잇다. 다음은 tag에 대해 설명해 놓았다.

Figure 6

Tag의 타입은 두 종류가 있다. : Short Tag Header 와 Long Tag Header. 첫번째 Word를 찾음으로써 Tag가 시작된다.

0x4302 ▶      0x0243 ▶     000 0010 0100 0011

Tag의 첫 10Bits는 Unsigned tag 이다. Tag 타입은 다음에 따라오는 Body내의 Data Block의 Data 타입을 결정한다.이 경우 Tag 타입은 9이고, SetBackgroundColor Block을 가리킨다. 다음 Unsigned 6Bits는 62Bytes 보다 작거나 같으면 Data Block의 길이를 의미하고 62Bytes보다 크면, 이 Field는 모두 1로 그 길이는 dword가 가리키게 된다. 우리가 살펴본 Tag에서, Field는 모두 1이 아니므로, 3Bytes 길이값을 의미한다.

0000 0010 01 = 9 = SetBackgroundColor
00 0011 = 3 = Body Length

Body의 길이가 3Bytes이므로, Body를 살펴보자. SetBackgroundColor tag는 3Bytes의 RGB color를 갖고 있으므로 다음과 같이 계산할 수 있다. Color은 3Bytes Data Type이므로 Byte Swapping은 일어나지 않는다.

0xFFFFFF = White

다음 Tag는 Long Tag이고 DefineShape Tag 이다.

0xBF00     0x00BF     0000 0000 1011 1111

0000 0000 10 = 2 = DefineShape

11 1111 = 63 = Body Length
( 다음 두 Bytes가 Body Length를 가리킨다. ( 역-Body Length가 62Bytes를 넘었기 때문에 다음 2Bytes가 Body Length가 된다. ))

0x23000000     0x00000023     35 = Body Length

다음은 DefineShape 을 정의한 것이다.

Figure 7

( 역 - 이 이후의 추가적인 번역은 수행하지 않겠다. 하지만 지속적으로 Tag를 찾아가 Parsing해 원하는 정보를
         얻는 과정은 모두 동일하다. )





'File Format' 카테고리의 다른 글

[Gindali] OLE 파일 구조의 이해  (0) 2012.09.11
Posted by GhostKei
,