왕콘치의 악성코드 연구소 02

By conchi | December 9, 2016

왕콘치의 악성코드 연구소 02





철 지난 악성코드들이여 내게로 오라!



왕콘치의 악성코드 연구소 2편! 빠밤!




서론


안녕하세여 왕콘치에여 :3


지난 시간 소개 글에 이어서 이번엔 본편으로 돌아왔어여:3

1편과 2편을 빠른 텀을 두고 올리고 싶은데… 괜찮겠니? 하고 팀장언니가 물어 보시기에

ㅎㅎ 그래욥! 하고 호언장담했는데

아니-_-… 이번에 분석하기로 한 녀석을 보다 보니 자꾸 뭐가 늘어나서;;

스케줄관리에 실패하고 몸땡이까지 질병을 얻은 망한 물고기(25)입니다.

앞으로 나레기에게 과대평가란 안 하는 걸로…;;


후… 특히나 이번 악성코드는 분명 DDos에 사용된 녀석인데

API를 체크해보니 네트워크 통신하는데 쓰는API들이 하나도 없더라구요

아니 이건 무슨 DOG같은 경우가 다 있나 해서 뒤져봤더니;

…….. ;;;



본문에서 확인하시져.

화가 차오르기 시작했어여.




당부의 말


요 글을 보기 전, 몇 가지 당부의 말씀을 적어보겠어여.


◎오래된 악성코드라 공격서버(C&C)가 죽음을 맞이한 상태입니다.

  • 따라서 분석환경이 상당히 제한적입니다 ㅜㅜ.. 왜 이것밖에 못했냐고 하면 그건 저도 할 말이 없는 걸로( ☞☜)

◎ 지난 편에서도 당부했듯이 전문적으로 악성코드를 분석하는 물고기가 아닙니다.

  • 그저 저는 이렇게 이렇게 분석 해 봐써여! 이런 나쁜생퀴들!! 만든 놈 똥 싸러 갔는데 휴지 없어라!!
    이런 정도의 수준을 가지고 있기에 그냥 제 눈에 보이는 내용들을 다 적을 확률이 높습니다.
  • 이런 글이 불편하시다면 뒤로 가기 눌러주시면 감쟈 하겠습니다.

◎ 백신회사에 재취업 하고자 하는 스파이 물고기가 아닌가

  • 저는 노잼 도시 대전을 사랑합니다.


언제까지나 저와 같은 컴알못을 위한 글입니다.

지나치게 별 볼일 없는 부분에 쓸데없이 상세해서, 아니 저건 왜 쓴 거야 도대체–;; 일상생활 가능한 부분?

이럴 가능성이 있으니 주의해주세요ㅋㅋ




사전 지식


음 이번 편에 들어가기 앞서 몇 가지사전에 알아두면 이 글을 보는데 조금 편할지도 모르는 꿀 지식들에 대해 몇 가지 언급하고 가겠습니다.


◎ 1. DLL(Dynamic Link Library, 동적 링크 라이브러리)란?


지난번엔 DLL에 대한 내용을 설명하려 할 때 업무 요정 님의 글을 링크 걸어놨는데

업무 요정님은 아래의 주소를 링크해두셨더라고요 ‘ㅅ’.. 이거 무슨 더블 포인터도 아니고;;

그래서 이번엔 제가 바로 걸어봅니다. 요 링크를 참고해주세요:)


◎ 2. Service란?


위키백과를 보면 알겠지만, 어쨌든 위키백과에서 말하고자 하는 걸 대충 요약해보면


  1. 오랜 시간 동안 실행되며, 특정한 기능을 수행한다.

  2. 사용자 간섭 없어도 됨. 마치 나와 같다.

  3. 보통 운영체제가 시동될 때 실행되며, 백그라운드에서 계속 돌아간다.
    (이건 마치 리눅스에서 데몬의 개념과비슷해 보인다.)


이 정도가 되겠습니다. 악성코드랑 무슨 상관인가 싶겠지만 제가 분석했던 악성코드는

dll이 서비스에 등록되는 형태였기 때문에 이를 이해하기 위해선 필요한 개념이라

제가 친절하게 준비해봤어요 헤헤!

그러니까 칭찬 좀 헤헷!!




본격 샘플 분석


자! 본격적으로 악성코드 샘플을 분석해볼 거예요(들뜸! 설렘!)


얘들은 7.7 DDos 때 사용되었던 악성코드라고 해요.


지난 시간 예고한 대로 어디서 힘겹게 구해왔습니다 ㅠㅠㅠㅠㅠㅠㅠ 넘나 힘든 것…

너무 오래돼서 샘플도 잘 없더라고요-ㅅ-…. 시무룩…

이미 자료가 많은 악성코드이므로 제 나름대로 이것저것 저것이 것

쓸데없이 상세하게 분석해버렸어요(멍….)

뭐야 이건! 싶으면 그냥 스크롤 내려서 맨 아래 짤 이나 보세요(?)


**※ 분석 환경 ※**
windows 7 32bit, 가상머신에서 분석했슴당 'ㅅ'      
최고의 분석 환경은 리얼 머신이라지만 제 리얼 머신은 소중하니까요.. ㅎ...      
(리얼 머신 날아가면 개복치처럼 돌연사 할 게 뻔함)


제가 구해온 샘플 폴더를 열어보니 이상 이상한 정체불명의 해시값으로 파일 이름이 설정된 두 개의 파일이 들어있습니다. 헤헤


나 같으면 77F*c*ing 뭐 이런 식으로 지을 법도 한데 왜 이렇게 해시값으로 지어놨을까요 ‘ㅅ’..?


악성코드들의 이름은 보통 해시 값으로 지어지며,
이렇게 만들어진 해시 값들을 이용하여 악성코드에 대한 정보를 공유합니다.


네 그래서 파일 제목이 해시 값인가 봅니다. 낄낄

그럼 요 두 개의 파일이 뭐 하는 녀석들인지 확인해보도록 합시댱 ‘ㅅ’ !



c2f8c12d6b8e6858d…


우선 뭐 하는 애들인지 궁금해서HxD에 올려봤습니다.

분석은 역시16진수로 하는 거 아니겠어요??(뭐래;)

그랬는데… 수상한 문자열들을 발견했어요!! +_+!!!



모다 인터넷 주소들이 잔뜩 적혀있는 게 아니겠듬..;;

(실제로 접속이 되는 주소들인지라 놀래서 가렸어요 히히 저는 간이 콩알만 합니다)


뭔가 한두 개가 아닐 것 같아서Strings를 이용해 문자열로 쭉 뽑아봤습니다.



Strings는 뭔가 내장되어 있는 명령어같이 생겼지만 명령어가 아닙니다.      
다운로드하는 거에여 'ㅅ'..  exe입니다.. 
그냥 따라 치다가 안 된다고 저한테 화풀이하면      
패러 갑니다 'ㅅ'!!.. 뀨!



이런 식으로url들이 적혀있어요;

공격할 사이트의 목록이 아니었나 싶어요.


그런데 주소 뒤에 get은 왜 붙는 건지 모르겠네여 ‘ㅅ’a 콘적콘적


그런데 목록들이 심상치 않네요 ;;;

정말 간이 큰 놈들이 아니었나 싶었습니다.

미치지 않고서야…;; 이게 뭐람…

(간이 쪼그라들기 시작함;;…)


해당 샘플에서는 url 주소가 들어있는 거 외에는 이상한 점을 발견하지 못했어요.

그런 걸로 보아 얘는 공격할 사이트의 목록을 담고 있는 부분이었던 것 같아요.

그런데 주소 뒤에 get은 왜 붙는 건지 모르겠네여 ‘ㅅ’a 콘적콘적


그! 래! 서! 파일 이름 해쉬 값을 바토에다가 던져봤어요 ㅋㅎㅋㅎ ㅅ_ㅅ!!

(파일을 던진 게 아닙니다’ㅅ’.. 제 샘플은 소중하니까여(?))



이 파일의 실명은 uregvs.nls라고 합니다.


이름도 구리고 별 기능도 없는걸 보니 진짜는 그 다음에 나오는 녀석인가 보군요.

다음 샘플을 확인 해 볼게여 헤헤




f9feee6ebbc3dc0d…



얘는 이름은 괴랄 하지만 PE파일입니다.

어디 조금 자세히 확인해보도록 해요



여느 파일들처럼IMPORT Address Table에API들이 낭낭하게 살아있네요.

히히 그럼 얘는exe인가 하고 신나있던 중…



EXPORT Address Table에 뭔가가 존재함을 발견했습니다.

;;; 아… 앙대… dll이라니..

더블클릭 해도 실행 안 되는 dll이라니 너ㅏㅁㄹ너ㅏㅇㄹ너알너라ㅣ끼에에에엥!!!!!



안녕히계세여 ㅎㅎ..;;!!


는 무슨 여기 이렇게 좋은 자료가 있습니다. 히히.. 감쟈합니당!




조오기 자료를 참고해가며 분석을 해보도록 하겠습니다.

후 이 슬라이드를 만드신 분은 천사가 틀림없졍 헤헤


일단service main에 등록시키기에 앞서 콘치는 여기서 뽑을 수 있는 고오급 정보가 더 없나 둘러보기로 했습니다.


그러던 중 또 한번 수상한 녀석들을 발견했어여.



perfvwr.dll이라는 이름의 dll을 하나 발견하게 됩니다.


얘가 서비스로 등록되나 보군요:3 헤헤 엄청난걸 발견한 느낌적인 느낌이 드네요.

그러면 perfvwr.dll이 실제로 동작하는 그런 녀석이 아닌가? 헤헤!! 하는 느낌적인 느낌도 덤으로 따라옵니다.


그런데 이쯤 되니 콘치에게는 하나의 불안감이 엄습했습니다.


근데 이거 오래된 악성코드인데..       
과연C&C가 아직까지 살아있어서 실제로 서비스를 등록해서 디버깅했을 때       
원하는 결과를 볼 수 있을까...??




[1장. 서비스와의 전쟁]


;ㅁ;… 는 말도 안 되는 소리 ㅜ 당시 사회에 큰 파장을 일으켰던 녀석이기 때문에

당연히 말도 안 되는 소리란 걸 깨달은 물고기는 콘무룩하게 바이너리를 IDA에 던졌습니다.

(절대로 귀찮아서 그런 게 아님…이렇게 해야 이번 시리즈가 망하지 않을 것 같은 느낌적인 느낌을 받았기 때문임… )


IDA에 던지니 역시나 DLL 이라는 걸 인증이라도 하듯이 DllMain과 DllEntryPoint와 같은 함수들이 보입니다.


하지만 와타시의 관심을 한 몸에 받고 있는 녀석은ServiceMain이므로, 이곳으로 날아가 분석을 시작해보기로 했습니당’ㅅ’!



짜잔! ServiceMain은 아까 PEView를 통해 봤던 것 보다 생각보다 많은 일을 하고 있는 듯 합니다.



은 막상 보니 그냥 값을 세팅하고 있네요’ㅅ’… 뀨(주석은 못 본 척 해달라능)


어떤 값을 어떻게 세팅하는지 한번 정리를 해봤습니다!


ServiceStatus.dwServiceType = 0x30;           
ServiceStatus.dwCurrentState = 2;            
ServiceStatus.dwControlsAccepted = 7;      
ServiceStatus.dwWin32ExitCode = 0;           
ServiceStatus.dwServiceSpecificExitCode = 0;  
ServiceStatus.dwCheckPoint = 0;              
ServiceStatus.dwWaitHint = 0;


음… 이렇게 값을 넣어두면 어쩌란거져’ㅅ’ㅋㅋㅋ

하나하나 다 찾아봐야 하니 넘나 귀찮지만 우리에겐 ㅅ…사스가 MSDN이 있습니다…


ServiceStatus라고 구조체 이름이 나와 있지만 사실 얘들의 본명은 _SERVICE_STATUS입니다.


따라서 구조체 안에 들어가는 인자가 궁금하신 분들은 구조체 명으로 검색하시면 아주 친절한 설명을 제공하고 있으니 참고하시면 됩니다.


뭔가 임의의 숫자들이 있는 부분들을 확인하니 다음과 같네요.


◎ ServiceStatus.dwServiceType = 0x30

  • SERVICE_WIN32_OWN_PROCESS(service runs in its own process)
  • SERVICE_WIN32_SHARE_PROCESS(service shares a process with other services)


◎ ServiceStatus.dwCurrentState = 2

  • SERVICE_START_PENDING(The service is starting)


◎ ServiceStatus.dwControlsAccepted = 7

  • SERVICE_ACCEPT_STOP(0x00000001)
  • SERVICE_ACCEPT_SHUTDOWN(0x00000004)
  • SERVICE_ACCEPT_PAUSE_CONTINUE(0x00000002)

출처 : msdn


이런 식으로 구조체에 값들을 예쁘게 넣어 서비스를 시작할 준비를 합니다.


그리고 그 다음에는SCM의 제어를 처리할 핸들러를 등록합니다. (RegisterServiceCtrlHandlerA)

요때 등록되는 서비스 이름이…



네’ㅅ’ 아까 우리가 봤던 수상한dll의 이름과 같네요 껄껄


이로써 우리는 이런 추론을 할 수 있게 됩니다.


  • 뭔가 서비스를 실행시키기 위해서 준비하는 과정을 거치고 있다.

  • 값들을 예쁘게 넣어둔다.

  • perfvwr.dll을 서비스로 올려 시작할 준비과정인 듯하다.

  • 핸들러를 등록해놓고 얘를 가지고 이제 뭘 할껀가보다.

  • 핸들러로 등록이 잘되면 서비스의 상태를service running으로 바꾼다.

  • 그리고는 prefvwr 서비스에 아까 위에서 예쁘게 셋팅해준 값들 적용시킨다.

  • 이 악성코드의 이름은 perfvwr.dll이라 해도 이상할 게 없는 상태


그러고 나면 v3 = CreateThread(0, 0, StartAddress, 0, 0, 0); 라는 부분이 나오고

뭔가를 시작하는 부분이 나옵니다.

쓰레드는.. 항상 눈 여겨 봐야한다능…

뭔가 핵심코드는 쓰레드 안에 많이들 들어가더라구요.

자 그럼 쓰레드를 위주로 한번 분석해봅시다.




[2장. 쓰레드… 아우 ㅆ..쓰레드 ㅅ_ㅅ!]


네 쓰레드입니다.

(욕 하려던 게 아닙니다)


저기 보면 StartAddress라는 부분이 있는데 저 부분에서 아주 수상한 냄새가 나므로 저 부분을 자세히 분석해볼 계획입니다.


※ 원래는sub_xxxxxxxx 형태로 되어있습니다. API이름_숫자 되어있는 건 제가 임의로 바꾼 부분입니다. ※




[2-1. 뭐야 이건ㅡㅡ;;; (부제: 숨은API를 찾아서)]


StartAddress로 들어와서

가장 첫 번째로 나오는sub_10001530()을 신나는 마음으로 더블 클릭했습니다!



..이게 뭐람;;

놀란 마음에 스냅샷도 안 뜨고 vm을 꺼 버려버려서

한30초 고민하다가 다시 이 부분으로 돌아왔습니다.


다른 함수들을 휘휘 구경하는데 들었던 의문점 두 가지가 있었는데 그 의문점들이 해소 되는 순간이었습니다.


  • 이거 분명DDos 공격샘플인데 왜 네트워크 관련API가 없지?

  • 뭔데 dword로 된 게 이렇게 많지?


ㅇㅇ.. 그럴 수밖에 없었는게 이 부분을 자세히 보면


  • LoadLibrary()를 이용해 Kernel32.dll를 사용할 준비를 함.

  • GetSystemDirectoryA()를 사용하기 위한 빅픽쳐!

  • 네트워크 관련API 얘들의 주소를 땡겨쓰기 위해 LoadLibrary()를 이용해 Ws2_32.dll를 사용하기로 함

  • GetProcAddress()를 이용해 Ws2_32.dll안에 들은 API 주소만 땡겨다가 잘 쓸 준비완료 수고링~


이런 구조이기 때문이에요.

와… 이건 진짜.. 혁명인듯…ㄷㄷ…


;;; ㅂㄷㅂㄷ… dword파티라 분석하는데 정신이 혼미해져 이름을 하나하나 바꾸어 주었습니다. ㅅ_ㅅ…



◎ ConTip
분석이 끝난sub함수 혹은 변수들에 대해서는 이름을 바꿔주는 편입니다.       
그래야 다음에 또 만나더라도 아 얘는 내가 분석을 이미 했구나! 혹은       
아 이게 어떤 기능을 하는 함수였군! 하고 알아차리기가 편하거든여.       
넘나 편리한 것(찡끗)


이 부분은 이렇게API 주소를 수집하는 기능 외에는 별다른 기능이 없었습니다.

그래서 다시 StartAddress로 돌아가 다음 sub함수로 넘어가 보았어요.




[2-2. 방화벽 꺼졍ㅅ_ㅅ]




하잉!


정체불명의 함수 안으로 들어왔습니다(sub_10002BDE).

os의 버전을 세팅하는 부분과, 레지스트리의 키를 오픈하는 부분이 보이네요.

레지스트리의 키로 뭘 하려는 건지, 이곳에서 무슨 일이 일어나고 있는지 한번 자세히 봅시당.


RegOpenKeyExA()를 이용해서 내 레지스트리 어딘가에 있는 키를 오픈합니다.


SubKey변수가 그 해답이 될 듯 하네요.



변수를 확인했더니 다음과 같은 경로가 들어있습니다.

이로써 우리는 이 악성코드가

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile

에 접근한다는 사실을 알 수 있게 됩니다. 호호히히



짜잔 실제경로에는 이런 데이터들이 들어있네요.

요기로 접근해서 뭘 하려나 한번 다음 소스를 확인해보도록 해염


result = RegOpenKeyExA(HKEY_LOCAL_MACHINE, SubKey, 0, 0xF003Fu, &phkResult);
if ( !result )
{
RegSetValueExA(phkResult, ValueName, 0, '\x04', Data, 4u);
result = RegCloseKey(phkResult);
}
return result;


RegOpenKeyEx는 성공적으로 키를 찾았응께 0을 리턴하게 될 거에요. (ERROR_SUCCESS)

그럼result 는0이됩니다. 여기를 참고하세여!

if문을 확인해볼게요.


if ( !result )
{
RegSetValueExA(phkResult, ValueName, 0, '\x04', Data, 4u);
result = RegCloseKey(phkResult);
}


result가 거짓(0)이면if문 안으로 들어가는데 위에서result가0이 되었으니if문 안으로 들어갑니다.


RegSetValueEx함수가 사용되네요. 레지스트리 키를 저장하는 함수입니다.

아까 위에서 얻은 핸들 값을 사용하고 있네요.



그 다음 인자인 ValueName은 ‘EnableFirewall’이네요.

그럼 그다음으로 중요한 EnableFirewall에 들어갈 값을 확인해볼까여’ㅅ’

Data는 위에서 확인할 수 있슴당


*Data = a1 != 0;


……..??????


?????????????

????????


여기서 한참 멘붕 했었어요-ㅅ-.. 아마도 헥스레이가 저렇게 해석을 한 거겠죠…;;

(저렇게 코딩했으면 명치 맞아야함..;; 뭐하는 거임 ㅜㅜㅜㅜ)


연산자 우선순위에 따라a1 != 0 이 먼저 연산됩니다.

a1은0이에요(이 함수로 들어올 때 인자가0이 들어갑니다)

따라서0 != 0 이 되는데 이건 거짓(0)이므로

*Data에는0이 들어가게 되져.


헤헤 다 구했당!


if문 안에서 동작을 마친 우리의 EnableFirewall은0으로 바뀌면서 방화벽이 해제가 됩니다.

(EnableFirewall의 값이1이면 방화벽이 설정되어 있는 상태, 0이면 방화벽이 해제된 상태를 의미합니다)


따란!!




[2-3. DDos 같은 느낌적 느낌(!)]


…으로 가기 전에 코드를 찬찬히 보고 있자니

자꾸만 시간을 체크하는 변수들과 함수가 보입니다.


but IDA로는 보는데 넘나 큰 한계가 있네요 ㅠㅠ

우선은 눈에 들어오는 녀석들부터 샅샅이 살펴봅시다.



v3 = CreateFileA(FileName, 0x80000000, 0, 0, 3u, 0x80u, 0);// FileName = uregvs.nls


쁍쀱쁍쀱(바스티온 아님;) CreateFileA() API로uregvs.nls라는 프로그램이 만들어집니다.


‘ㅅ’..!!!!?

아까 처음 분석했던 바이너리 이름이 uregvs.nls였는데?!!?!!? 끠!?!


우선은 제쳐두고IDA에서 육안으로 확인이 가능한 부분만 분석해보도록 합시다.

저는 CreateThread안에 있는 함수들을 위주로 분석해봤습니다.

쓰레드 인자들을 위주로 타고 다니던 중 아주 수상한 냄새가 나는 부분을 발견했어여.


v14 = rand() % 5;
if ( !lstrcmpA(lpString1, get_String2) )
{
  v15 = aCacheControlNo;
  if ( !v13 )
    v15 = &byte_1000F9FC;
  sprintf(
    &v20,
    "GET %s HTTP/1.1\r\n"
    "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-e"
    "xcel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, ap"
    "plication/vnd.ms-xpsdocument, application/xaml+xml, */*\r\n"
    "Accept-Language: ko\r\n"
    "UA-CPU: x86\r\n"
    "Accept-Encoding: gzip, deflate\r\n"
    "User-Agent: %s\r\n"
    "%sHost: %s\r\n"
    "Connection: Keep-Alive\r\n"
    "\r\n",
    v29,
    &aMozilla4_0Comp[200 * v14],
    v15,
    v27);
}
result = lstrcmpA(lpString1, aPost);
if ( !result )
{
  v16 = aNoStoreMustRev;
  if ( !v13 )
    v16 = aNoCache;
  result = sprintf(
             &v20,
             "POST %s HTTP/1.1\r\n"
             "Accept: */*\r\n"
             "Accept-Language: ko\r\n"
             "Referer: http://%s/\r\n"
             "charset: utf-8\r\n"
             "Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n"
             "Accept-Encoding: gzip, deflate\r\n"
             "User-Agent: %s\r\n"
             "Host: %s\r\n"
             "Content-Length: 0\r\n"
             "Connection: Keep-Alive\r\n"
             "Cache-Control: %s\r\n"
             "\r\n",
             v29,
             v27,
             &aMozilla4_0Comp[200 * v14],
             v16,
             v27);
}
v17 = v30;
v31 = 0;
if ( *(v30 + 268) > 0u )
{
  a2 = v30 + 68;
  do
  {
    v18 = WSAAsyncSelect_1000F870(2, 1, 6, 0, 0, 0);
    v32 = v18;
    if ( v18 != -1 )
    {
      v19 = *a2;
      v26 = *a2;
      LOWORD(v19) = *(v17 + 272);
      HIWORD(v25) = Htons_1000F834(v19);
      LOWORD(v25) = 2;
      if ( Wsaconnect_1000F7F0(v18, &v25, 16, 0, 0, 0, 0) == -1 )
      {
        Closesocket_1000F868(v18);
      }
      else
      {
        Send_1000F84C(v32, &v20, strlen(&v20), 0);
        Sleep(dwMilliseconds + 30);
        Closesocket_1000F868(v32);
      }
    }


누가 봐도 구린 냄새가 나는 부분입니다.


이건 진심 지나가는 물고기도 냄새 맡고 다시 한 번 볼 부분 아닌가여’ㅅ’a?

심지어 sprintf를 사용해서 &v20에 그 값을 넣고 아래쪽Send하는 부분에서 보내버리네여.

ㅅ0ㅅ;;

…는 웹고자 물고기라 저게 왜 공격인지 모름ㅎㅎ.. 그냥 구린내만 맡음 킁킁


후 웹 넘나 어려운것.. 없어져버렸으면(??)

잘 모르겠으니 수상한 부분들을 하나하나 분석해보도록 해염




"User-Agent: %s\r\n"


처음에는 여기에 하나의 값만 들어가는 줄 알았는데 아니더라구요



이런 식으로 다섯 가지의 형태로 계속해서 변경됩니다.

골라먹는 재미(?) 그런 건가’ㅅ’…뀨


검색해보니 딱히 막 수상하게 변조된 것도 아니고 정상적인 메세지라고 합니다’ㅅ’…

무튼 그렇습니다’ㅅ’


그리고 보면 post일때와 get일 때 send되는 내용이 좀 달라여

get일때가 뭔가 더 푸짐해 보입니다.


그럼 어떨 때get으로, 어떨 때post로 전송되는지도 한번 연어마냥 거슬러 올라가봅시다.


if ( !lstrcmpA(lpString1, get_String2) )


post와 get으로 나누는 시작점이 되는if문입니다.

strcmp로 lpStrint1에 들은 내용과 String2에 들은 내용을 비교합니다’ㅅ’

get_String2라고 만들어둔 건 저안에get라는 문자열이 들어있어 제가 임의로 바꿔줬어여 헤헤

결국 lpString1에 get이라는 문자열이 들어있으면 get 형태로 넘어간다는 소리가 되겠군여


요 녀석을 쭈우우우욱 추적하다 보면 StartAddress까지 올라오게 되고


  GetLocalTime(&SystemTime);
  SystemTime.wYear = 2009;
  SystemTimeToVariantTime(&SystemTime, &pvtime);
  v2 = 0;
  v3 = CreateFileA(FileName, 0x80000000, 0, 0, 3u, 0x80u, 0);  // FileName = uregvs.nls
  hFile = v3;
  if ( v3 != -1 )
  {
    NumberOfBytesRead = 0;
    ReadFile(v3, &Buffer, 8u, &NumberOfBytesRead, 0);
    ReadFile(hFile, &v27, 4u, &NumberOfBytesRead, 0);


아까 시작할 때 만났던 이 코드에서 &v27까지 오게 됩니다.


v27은 hFile이 담긴 버퍼의 주소일 테고, hFile은 v3,

v3은 아까 만들었던 uregvs.nls파일의 핸들이 되겠네요.


결국get post방식으로 나누던 거는 uregvs.nls파일에 있던 도메인 뒤에 붙어있던 정체불명의 ;get, post가 공격 방법이었던 것 입니댜.


근데 제가 가지고 있는 uregvs.nls에는 거의 다 get이라고 적혀 있어여 헤헤’ㅅ’..!




예상 공격기법


실제로 공격을 때려볼만한 환경이 못되서…(시무룩)

소스코드 분석으로 인해 알게 된 사실들을 모아모아모아서

어떤 기법으로 DDos를 일으켰는지 추측 해 봤습니댱 헤헤’ㅅ’ !!


HTTP GET Flooding 과 CC Attack이 사용된 듯 합니다.

두 공격에 대한 내용은 아래의 링크를 참고해주세요:)

설명이 넘나 잘되어 있습니댜 헤헤


[DDoS기획] DDoS 최신 공격 기법과 방어 기법




마치며


뭔가 간지나게 실제로 파일이 떨어지는 것도 확인하고 했어야 했는데

그렇지 못한 채 IDA로 분석만 한 것 같아 뭔가 시무룩해졌어여.

내가 원한 건 이런 게 아니었는데 겁나 간지가 안 났네요


음..

음…..

악성코드 연구소는 잠시 멈추고 다른 거나 해야겠어요ㅅ_ㅅ!

두 번 연달아 했다가는 두부 같은 제 멘탈이 남아나질 않겠네요!!


제 역량으로는 조금 벅찬ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


다음 편은 어떤 글로 여러분들 앞에 나타날지는 잘 모르겠지만

그때까지 다들 몸 건강히 잘 지내세여(?)


사실 이번에 오버워치 경쟁전 실버 끝자락이라 골드가야해서 당분간은 조용하지 싶어요 ㅎㅎ..

오버워치는 실버구간이 심해인가요? 개똥인간들이 많네요.

(버스 태워주실 분들 모집합니다)

갑자기 글 마무리하다 말고 이게 무슨 소린지는 모르겠지만


항상 꾸준하게 약을 많이 마신상태라 그런 걸로 치고 넘어가 주세여

그럼 전 이만! 빠른 시일 내로 유익한(?)글과 함께 찾아오겠슴당

안녕히 계세요~!




악성코드 연구소2편 뒷이야기



결론: 윈도우디펜더 존재감 개쩜…;;

뿅!

comments powered by Disqus