2007.08.06 22:30

폴더플러스 클라이언트 분석기

요즘 컴퓨터 업계에서 가장 돈을 많이 버는 동네는 어디일까?
일단 NC소프트 등 온라인 게임회사가 있을테고.
MS를 제외하고 특출난 수익을 올리는 소프트웨어 제작사는 드물어 보인다.

몇 년전 초고속 인터넷이 퍼지면서 등장한 웹하드 시장.
처음에는 팝폴더, V-Share 등 몇 안되는 회사가 있었지만
지금은 우후죽순 엄청난 수의 유료 웹하드 서비스가 만연하고 있다.

그 이유는 무엇인가?
우리나라엔 정품 소프트웨어 돈 주고 사는 꼴은 죽어도 못본다는 사람들이 아주 많다.
고속 인터넷이 등장하기 전 부터 '백업CD' 사려는 사람은 줄을 섰어도
정품 사겠다는 사람은 골 빈 놈 취급 당했다.

손노리 등 유수의 게임 개발사가 무너질 수 밖에 없었던 이유가 바로 복법복제였는데도
국내 게임 유저들은 말로만 각성할 뿐, 게임은 다운 받아 하는 것이 당연하다는 태도다.

몇몇 생각이 있는 게이머들은 나름대로 공동구매를 하고 특별판을 구입하며
국내 게임 시장에 충성을 다했지만 게임회사들은 끊임없는 우려먹기와 주얼판 발매로
그나마 남아있던 패키지 게임시장은 거의 사장되었다.

죽어라 소프트웨어를 만들어도 사는 사람이 없다면
누가 소프트웨어를 만들겠는가?

다행히, 모든 컴퓨터 이용 환경은 네트워크 종속을 지향하며 발전하고 있다.
이제는 단순히 컴퓨터에 설치되는 프로그램에 가격을 매기고
소비자가 돈을 줄 때까지 기다리는 것이 아니라,
네트워크를 통해 새롭고 지속적인 서비스를 제공하면서
이에 대한 비용을 청구하는 형태로 바뀌어진 것이다.

앞으로 계속 이러한 추세가 심화되겠지만
꼭 네트워크에 묶여야 되는 프로그램이 아니라면 문제가 된다.

아래의 예를 살펴보자.

"나에게 지금 꼭 필요한 프로그램이 있다. 가격을 알아보니 한 카피당 4~5만원 한다.
솔직히 돈 주고 사는 좀 아깝다. 어디 공짜로 쉽게 구할 곳 없을까.
인터넷에 널려 있는 웹하드 서비스에서 그 프로그램을 검색해 보니 떡허니 올라와 있다.
다운로드 받으려 하니, 3MB당 1원을 내라고 한다. 100원이면 300MB.
세금합쳐 1100원만 핸드폰으로 결재하면 CD 5장 정도의 프로그램과 영화를 받을 수 있다.
이거 1000원이면 부담도 안되고 꽤 괜찮네.
비디오 가게가서 비디오 하나 빌려 볼 돈이면 영화 5편을 볼 수 있는 거잖아."

사용자는 마치 좋은 프로그램을 거의 공짜로 얻는다는 짜릿한 쾌감마저 느끼면서
아무런 양심의 가책도 없이 결재를 하고 프로그램을 다운 받는다.

누가 그거 불법 아니냐고 물어도 "난 이거 돈 내고 받는건데?" 한 마디면 끝이다.
세상 참 편해졌고 이런 세상에서는 원칙대로 사는 사람이 바보 같아 보인다.

그래서 난 웹하드 업체들을 싫어한다.
그들은 회사 안에 무식하게 큰 서버와 하드디스크만 연결해놓고
남이 만든 질 좋은 프로그램을, 마치 자신이 만든 것인냥 돈을 받으면서 팔고 있다.

그것을 의도하였다, 의도하지 않았다는 별로 중요하지 않다.
중요한 것은 지금 상황이 이렇게 돌아가고 있다는 것이다.

원칙대로라면 그들이 수익을 올릴 수 있는 부분은
집에서 찍은 홈비디오를 컴퓨터 하드에 용량이 모자라
웹하드 계정에 업로드하고 30일 후에 다운 받을 때 정도다.

몇 년전 학교 선배가 V-Share를 해킹하여 포인트 없이
자료를 다운 받을 수 있게 만든 프로그램을 보았다.
원래 V-Share는 자료를 다운로드 하면서 포인트를 삭감하고 삭감된 수치를 서버로 보내는데
이 부분을 먹통으로 만든 것이다.
(이 프로그램은 외부로 유출하지도 않았고, 몇번 사용하다 매장했다)

나중에 V-Share 클라이언트는 ASProtect라는 팩커로 암호화 됐다고 하는데
이 정도면 리버스 엔지니어링에 관심이 있는 프로그래머라면
손쉽게까지는 아니어도 마음만 먹으면 풀어낼 수 있다.

프로토콜 설계 자체가 잘못되었는데 이를 바꾸지 않고
외부 프로그램으로 암호화를 해대봤자 무슨 소용이 있겠는가.

그래서 오늘 한창 잘나가고 있는 '폴더플러스' 클라이언트를 살펴보았다.
오랜만에 SoftICE, ollyDebuger, PEid, PE-Explorer, WPE, Packet Sniffer 등
리버스 엔지니어링과 패킷 분석에 필요한 프로그램들을 설치하고
하나하나 살펴보기 시작했다.

1. 뭘로 만들어 졌나?

'Microsoft Visual C++ 6.0' 으로 만들어졌단다.
Packer로 압축 / 암호화 되지 않은 것만으로도 왠지 뚫을 수 있겠다는 희망이 있었다.

2. 첫번째 시도. 부족한 코인을 무시하라.

올리 디버거에서 불러와 이것저것 건드려 보는 모습.
코인이 부족할 경우 분기되는 부분을 정상적으로 다운로드 되는 부분으로 옮겼으나
서버와 연결이 되지 않았다면서 에러를 발생.
(말이 쉽지 어셈 소스 분석은 시간을 필요로 한다)

3. 두번째 시도. 로그인시 암호체크 부분을 무시하라.
아마 이럴 가능성은 없겠지만,
얼마 전 유명 영어강좌사이트 Y사 홈페이지를 둘러보다가
로그인 부분이 허술하게 되어 있어 너무 쉽게 유료 강좌들이 뚫리길래
미친척 한번 시도해 보았다.

틀린 암호가 입력되어도 올바른 암호가 들어간것 처럼 착각하도록 유도했는데
로그인이 제대로 된 것으로 인식한 뒤에 서버와 통신을 시도하다가 에러 발생.

4. 그렇다면 패킷을 보자.
애용하는 패킷 스나이핑 프로그램은 실시간 분석이 가능한 프로그램이다.
학회 선배가 만든 프로그램인데, 윈도우즈의 소켓통신을 담당하는 wsock32.dll 파일의
모든 함수를 후킹해서 해당 프로세서에 오고가는 패킷을 실시간으로 확인할 수 있다.
(사실 이 기법은 윈도우즈 드라이버 단까지 들어가지 않는 쉬운 방법에 속한다.)

그런데 이거 패킷이 하나도 보이지 않는다.
설마 이 프로그램 후킹을 알아차린단 말인가??
아니면 winsock을 사용하지 않는거야?? (에이, 설마.)
생각이 여기까지 미치자 국내 소프트웨어 산업도 많이 발전했을 수도 있다는 생각이 들었다.

군대오기 전에 MPEG4 DRM에 관련된 회사에서 잠깐 아르바이트를 한 적이 있는데
MPEG4 파일을 분석해서 실시간 플레이가 가능한 단위로 잘라내
암호화 / 복호화 하는 프로그램이었다.

하지만 회사에서는 DRM의 생명이라 할 수 있는 암호화 부분을 얼마나 소홀히 다루던지.
암호화 알고리즘이 아무리 256비트, 512비트면 무슨 소용이 있나.
암호키가 함수 인자로 아무런 보호도 없이 나다니고 있는데. 암호키 생성도 웃기는 짬뽕 수준.
마음만 먹으면 아무나 다 뚫을 수 있겠다라고 생각하면서 국산 IT업계에 대한 회의 마저 느꼈다.
(그렇다. 난 당시 세상에 때묻지 않은 순수 프로그래머였다. ㅡ_ㅡ)

5. 문제는 IAT.
소켓 부분을 살펴보다가 문제를 발견했다.
wsock32.dll과 ole32.dll에 꼼수를 사용한 것이다.
다른 dll 파일에서 함수를 불러올 때는 MessageBoxA(), GetDlgItemA() 등 함수명을 사용했는데
wsock32.dll과 ole32.dll 파일의 함수를 사용할 때는 함수명이 아닌
고정 주소값을 이용해서 함수를 호출하고 있었다.

Import Reconstructor를 이용해 Import Address Table을 다시 생성해 붙이는 모습.

PE Explorer에서 wsock32.dll의 함수명이 제대로 뜨는 것을 확인할 수 있다.


IAT가 뭔지 모르는 분들은 'PE 파일 구조'에 대해 공부하면 된다.
윈도우 해킹의 시작은 'PE 파일 구조' 분석이다.

6. 로그인 부분 패킷을 보자.
보통 패킷 분석이라하면 프로그램이 사용하는 특정 포트의 패킷 비트 하나하나를
적당히 통밥과 눈치로 각 명령어에 대입해 보는 것이 지금까지의 방식이었다.
(남들은 어떻게 하는지 몰라도 나는 이렇다)

그런데 이게 왠걸. 이 폴더플러스 클라이언트는 모든 통신을 80번 포트로 한다.
80번 포트라면 http 포트이고, 즉 모든 통신을 http 프로토콜에 따라 문자로 한다는 소리다.
이를 가능케 하기 위해서 SOAP이라는 기술을 사용했다.

SOAP이 무엇이냐. 구글에 물어보니
'SOAP (Simple Object Access Protocol)은
웹상의 객체들을 액세스하기 위한 마이크로소프트의 프로토콜이다.
이 프로토콜은 HTTP를 사용하여 인터넷에 텍스트 명령어를 보내기 위해 XML 구문을 쓴다.
SOAP은 COM, DCOM, 인터넷 익스플로러, 마이크로소프트의 자바 이행 등 내에서 지원된다.'
라고 대답해 준다.
무슨 소리인지 모르겠으면 그냥 http로 딴짓도 할려고 만든거구나 하고 생각하면 된다.

실제 패킷 코드를 보자.
읽을 수 있는 문자로 되어있어 분석이고 뭐고 없다.
그냥 보면 알 수 있다.

GET /?fpMain=17 HTTP/1.1
Accept: */*
Accept-Language: ko
Accept-Encoding: gzip, deflate
If-Modified-Since: Sun, 20 Nov 2005 12:30:42 GMT
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: www.folderplus.com
Connection: Keep-Alive

HTTP/1.1 200 OK
Date: Sun, 20 Nov 2005 12:41:14 GMT
Server: Apache/1.3.26 (Unix) Debian GNU/Linux PHP/4.1.2 mod_perl/1.26
X-Powered-By: PHP/4.1.2
Expires: 0
Last-Modified: Sun, 20 Nov 2005 12:41:14 GMT
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=euc-kr
Content-Language: ko

클라이언트 환경을 넘겨주자, 서버측 환경이 넘어왔다.
아파치에 PHP, perl을 기본으로 한다.....

GET /IO/DNS2.cgi?userid=xissy HTTP/1.1
Host:ddns.folderplus.com

HTTP/1.1 200 OK
Date: Sun, 20 Nov 2005 12:41:14 GMT
Server: Apache/1.3.27 (Unix)  (Red-Hat/Linux) mod_perl/1.27
Connection: close
Transfer-Encoding: chunked
Content-Type: text/plain

95
A001FOLDER:222.122.14.42
A001DOWN:222.122.14.149
A001UP:222.122.14.32
A002FOLDER:222.122.14.131
A002DOWN:222.122.57.140
A002UP:222.122.57.150
{EMEND}
0

통밥으로 재어보면
각 폴더정보와 다운로드 정보, 업로드 정보를 담당하는 서버가 2대씩 있다는 것을 알 수 있다.

오고가는 자료가 많으니 간추려 보겠다.
SOAPAction: "http://kerberos.embian.gnu/FTPService2#Authenticate3"
인증 과정이라는 뜻이다.
<strusername xsi:type="xsd:string">xissy</strusername>
ID를 보낸다.
<strpassword xsi:type="xsd:string">?????</strpassword>
패스워드를 보낸다. 암호화 하지도 않고 쌩으로 보낸다.
<s-gensym1388 xsi:type="xsd:base64Binary">QTAwMUFVNTUxMjQwMDM2MTY5ODE=</s-gensym1388>
서버에서 이상한 base64Binary형 데이터가 하나 넘어왔다.

SOAPAction: http://kerberos.embian.gnu/FTPService2#GetDriveInfo"
드라이브 정보를 얻어온다.
SOAPAction: "http://kerberos.embian.gnu/FTPService2#ListDirectory3"
폴더 리스트 정보를 받아온다.
SOAPAction: "http://kerberos.embian.gnu/FTPService2#GetMountList"
친구 리스트 정보를 가져온다.
SOAPAction: "http://kerberos.embian.gnu/FTPService2#hi"
접속 시간을 받아온다.

<strPath xsi:type="xsd:string">Home:</strPath>
Home: 경로를 보내는 것을 보아 계정의 정보를 얻어올 듯 하다.
<strSessionId xsi:type="xsd:string">U55124003616981</strSessionId>
세션 아이디를 보낸다.

이 세션 아이디를 보내는 부분이 주목해야 할 부분이다.
위에 base64형으로 넘어온 'QTAwMUFVNTUxMjQwMDM2MTY5ODE='를 인코딩하면
바로 'A001U55124003616981'이다.
앞의 'A001'은 앞에서 본 A001서버를 의미할테고
'U55124003616981'가 서버에서 넘어온 세션ID가 되는 것이다.

즉, 우리가 제대로된 아이디와 패스워드를 서버로 넘기면
서버에서는 사용자ID에 따라 세션을 설정고 클라이언트에게 해당 세션ID를 부여한다.
그리고 이 세션ID로만 통신을 함으로써
클라이언트측에 함부로 자료를 공개하지 않게 된다.
세션ID는 로그인시마다 무작위로 바뀌기 때문에 비정상적인 접근을 막는데도 용이하다.
(이 무작위로 바뀌는 세션ID 생성에 blowfish가 사용된 것 같다)

그렇다면 암호가 틀릴 때는?
<faultstring xsi:type="xsd:base64Binary">RmFpbCB0byBhdXRoZW50aWNhdGlvbiA=</faultstring>
이런 코드가 넘어온다.
'RmFpbCB0byBhdXRoZW50aWNhdGlvbiA='의 뜻은 'Fail to authontication'이다.

즉 암호가 제대로 서버에 전달되지 않으면
서버에서 클라이언트와 통신할 세션 자체가 생성되지 않으므로,
로그인 부분을 해킹에 이용하려면 현재 서버에 마련되어 있는 세션에 의존하는 수 밖에 없다.
이런 시도는 이미 세션을 사용중인 진짜 사용자와 충돌할 수 있으므로 자재해야 한다.

7. 코인 부분 패킷을 보자.
로그인하여 파일 다운로드를 실행하면
세션ID, 파일이 있는 사용자ID, 파일이 있는 폴더, 파일명, 시작지점이 서버로 넘어가고
서버에서는 코인이 있으면 바로 파일의 binary를 문자로 클라이언트로 전송하기 시작한다.
클라이언트는 문자형식으로 넘어오는 데이터를 차곡차곡 파일로 저장한다.

전송 중 코인이 다 떨어지면 즉시 파일 전송이 정지되며
ErrorCode: 1016
ErrorString: Not Enough Money
이라는 에러를 보내오고 클라이언트는 '코인이 부족합니다'라는 메시지를 출력한다.

클라이언트에서 코인을 설정할 수 있는 부분은 전혀 없으며
자료를 다운로드함에 따라 서버에서 자동으로 코인을 삭감시킨다.
자료를 다운할 동안 코인이 삭감되는 것을 클라이언트로 보내오지 않기 때문에
자료 다운 중 실시간 코인 정보를 제공하지 않으며
이는 결과적으로 보안 수준을 높이는 요인이 되었다.

클라이언트가 코인을 확인할 수 있는 곳은
SOAPAction: "http://kerberos.embian.gnu/FTPService2#GetUserProfile2" 의
<Coin xsi:type="xsd:int">????</Coin> 부분 밖에 없다.

8. 마치며
분석한 결과 '폴더 플러스' 웹하드 서비스는
적어도 프로토콜에 설계에 있어서만은 허점이 없는 것으로 보인다.

클럽박스, V-Share 등 프로토콜 설계 자체에 허점이 있는 웹하드 회사들이
각종 해킹 프로그램에 속수무책으로 당하고 있음에도 불구하고
이미 사용자층이 너무 커버려서 어쩔 줄 몰라 하고 있는 것과는 대조적이다.
마구잡이로 기능만 구현하면 된다는 생각은 이런 불행으로 다가오게 된다.

물론 버그가 없는 프로그램은 있을 수 없기에 언제 어떻게 뚫리게 될지 모르지만
초기 웹하드의 불안성에서 벗어났다고 할 수는 있겠다.

하지만 아직 보완해야할 점도 많다.
패스워드를 암호화 하지 않고 그냥 넘기고 있고
자료를 주고 받을 때도 아무런 보호가 없다.
SSH면 좋은 방패막이 될 수 있지 않을까.

이로써 몇 시간에 걸친 분석기를 마친다.
코드와 패킷을 분석한 시간과 이를 글로 정리한 시간이 비슷하게 걸렸다.
문서화의 어려움을 다시 한번 느낀다.

출처: http://xissy.egloos.com/926614

신고
Trackback 0 Comment 4
  1. Jordan 4 2012.02.17 17:20 신고 address edit & del reply

    나이 키 AIR JORDAN 흥행 을 잘 팔 리 는, 4 Shoes 고품질, 일로 돼 씻 어도 된 다.

  2. Monster Beats 2012.05.07 16:38 신고 address edit & del reply

    북한 미국인들은 미국 남부 라이벌, Daiane하여 자신의 목표 덕분에 대한 두 번째 분 리드를 얻을 운이 있었다.
    http://www.cheapmonsterbeatsby.org/monster-beats-studio-c-4.html
    http://www.cheapmonsterbeatsby.org/monster-beats-solo-c-5.html
    http://www.cheapmonsterbeatsby.org/monster-just-beats-c-13.html
    http://www.cheapmonsterbeatsby.org/monster-ibeats-c-3.html
    브라질 공격수 마르타는 레이첼 Buehler에 의해 페널티 지역에서 내려졌고 이후 경기는 논쟁에 의해 손상되었다. Cristiane로 촬영한 결과 위약금은 미국 골키퍼 솔로으로 구원과 심판이 침해 있었했다고 판결 후에 탈환했다. 마르타는 두 번째 찍었는데, 그녀가 이번에는 솔로를 이길 있는지 확인했다.

  3. Jordan Retro 4 2012.07.23 15:38 신고 address edit & del reply

    지금까지 진정한 블루 왕족의 피가되고 꿈꿔왔다면 다음 법원, 당신에게 방법의 모든 단계를 지켜보고있는 공주로 통로를 따라 걷다. 아니면 스타에 빠진 사람이라면, 주위 유명 인사 impersonators와 결혼.
    http://www.fireredjordan4s.com/ Jordan Retro 4
    http://www.fireredjordan4s.com/ Jordan 4s
    http://www.fireredjordan4s.com/ Jordan 4 Fire Red
    http://www.fireredjordan4s.com/ Jordan 4 Fire Red 2012

  4. RobertoniJicy 2016.01.02 22:58 신고 address edit & del reply

    10 ЭННИ ХОЛЛ режиссер Вуди Аллен, 1977 Неделя Вуди Аллена гл.
    Некоторые так и стремятся найти новую пассию в определенных целях.
    Связи могут значительно помочь Девам-Котам.
    Как влюбить в себя Мужчину-Водолея?
    СИФОН Вас сегодня просифонит, и вы идете по подземному гороскопу, - к расправе.

    cccp



티스토리 툴바