본문 바로가기

About../Security

버디버디 도배 금지 풀기

이번 강좌에서는 도배를 하는법에 대해서 다루겠는데요

대부분의 Game들과 Chatting들은 원활한 환경을 제공하기

위해서 도배를 할수 없도록 해놓지요.

오늘의 예제로 쓸 버디채팅 역시 마찬가지입니다.

버디 채팅에서 도배를 하면 어떤 메시지 박스가 뜨는것이 아니라,

곳바로 방에서 나가져 버리기 때문에,

어떤 String Reference를 추적하는건 불가능하다고 생각될지도 모릅니다. ;)

어떤 방법을 쓸지 잘 감이 안올지도 모르죠 ;)

외국에서도 Online Game을 우리나라 만큼 많이 하지 않아서인지 ;)

Online Game의 도배하는법에 대해서는 다루는 강좌를 찾기가 힘들더군요 ;)

(아니, 아에 찾지 못했습니다 T.T)

뭐, 오랜만에 방학을 맞아서 푹 자다보니깐 글쓸 마음도 생기고 해서,

글을 한번 적어 보겠습니다. ;)

예~! ;) 먼저 버디채팅을 켜봅시다.

위와 같은 화면을 만날수 있습니다.

여기서 대화를 나누는것이지요. ;)

대화창에 말을 빠르게 쓰면 방에서 나가지게 됩니다.

그 주기는 1초에 4번 입니다. ;)

이제 우리의 친구 프로그램인 wpe를 킨후에

대상 프로그램으로 BuddyChat.dll을 잡아 주신후

패킷 스니핑을 시작합니다.

그런후 채팅창에 도배를 한번 시도해봅시다.

예~! 위와 같은 패킷들이 잡힌후 방에서 나가지는걸 볼수 있을겁니다. ;)

@CHT는 채팅창에 말을쓸떄,

$CCL은 방에서 나가질떄 서버 사항을 받는 패킷임을 알수 있습니다.

(이런걸 알아내는 과정은 충분한 피드백을 필요로 하겠죠)

   

예. 우린 지금 하려는 작업의 70%를 끝낸겁니다. ;)

머리가 바보가 아니라면, 여기서 How to 에 대한 응답은 끝나셨을겁니다.

뭐 노파심에 How To 에 대한 응답을 하자면,

버디채팅의 구조를 밑에와 같이 프로그래머가 작성했음을 추론해볼수 있습니다.

   

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

①1초마다 0으로 세팅되는 변수가 하나 존재한다.

② ①에서의 변수와 4(번)를 계산하여,

jl = 작다면 = 크지 않다면 점프한다.

③만약 점프를 하게 되면 그곳에는 방에서 나가지는

Routine이 존재할것이다.

점프를 하지 않게되면, 패킷(@CHT)을 방에 있는 다른 사용자들에게

보내어서, 내가 할말을 전한다.

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

   

그렇다면 우리는 두가지 방법으로 접근해볼수 있겠죠 ;)

1초마다 0으로 세팅되는 변수를 Tsearch같은 메모리 파인더로 찾아낸다.

(이건 무지 노가다 작업이고, 비효율 적이며 무식한짓입니다.)

두번쨰 방법은 4와 비교하여 점프를 하는 부분을 찾아내어 nop시킨다.

   

당연히 후자의 방법이 훨씬 효율적입니다.

그렇다면 해당 부분은 어디서 부터 추적해 들어가야 할까요?

이것역시 두가지 선택이 가능합니다.

첫번쨰는 @CHT가 쓰이는 부분부터 위로 따라 올라가면 될것이고,

만약 이런 문자열을 쓰기 귀찮다면 WS_32.DLL의 send함수에

Break Point(중단점)을 설치하여 위로 올라가도 무리가 없을것입니다.

(후자의 방법은 패킷이 많이 왔다 갔다 하는 fps게임에 비효율적입니다.)

   

이제 아시겠나요? ;)

방법에 대하여 완전히 간파했으니,

이제 Olly Dbg로 해당 부분을 찾는 작업을 시작합시다. ;)

OllyDbg를 키시고 대상 프로그램으로 BuddyChat을 Attach 시킵니다.

그후에 버디버디 메인 모듈에서 밑의 그림과 같이

All referenced text strings 메뉴를 클릭하여 @CHT 문자열을 찾습니다.

문자열을 찾았으니, 마우스 오른쪽 버튼으로 클릭한후,

Follow In Disassembler 메뉴를 클릭하면,

해당 문자열이 쓰이고 있는 부분으로 코드창이 옮겨지게 됩니다.

이제 이부분을 찾았으니 위로 따라 올라가며,

4와 비교 하는 부분이 있는지 찾아 봅시다.

엇 따라 올라가다 보니 ;)

이 부분은 call에 의해 호출된 함수 형태였음을 알수 있습니다.

(코드를 보면 알수 있습니다 - > 경험자에게 물어보세요;p)

이곳에 브레이크 포인트를 걸고 아무말이나 채팅창에 써보면,

브레이크 포인트가 걸리고 그림에서 처럼

오른쪽 하단의 스택창에 Return Address가 0x0040B8F1임을 알수 있습니다.

그럼 이제 저 주소로 코드위치를 옮깁시다 ;)

(아참 브레이크 건건 혼란을 방지하기 위해 풀어주는 습관 ;p)

예 대략 이런곳으로 빠져나오는군요 ;)

계속 코드를 살펴 보며

jl이 없는지 확인하며 위로 올라가 봅시다. ;)

(상당히 이부분도 어느정도 노가다성이 있군요 ;)

(이럴떄는 확실히 Olly보다는 Disassembler가 편할지 모릅니다.)

오~! 드디어 찾아내었습니다. ;)

0x40B783이라는 주소에서 첫번쨰 jl을 만날수 있었습니다. ;)

4보다 작을 경우 점프라는 조건인

cmp eax, 4

jl @주소

형식임으로 우리는 이것을 jmp @주소 형태로 고쳐 주면,

1초에 말을 4번 이상 써도 팅기지 않을것입니다. ;)

한번 메모리 패치를 하여 보죠 ;)

위의 그림과 같이 어셈블 메뉴를 이용하여,

JL 40B864 명령을 - > JMP 40B864 NOP

로 변경하여 주었습니다. ;)

메모리 패치를 해주었으니 실제로 도배가 되는지 테스트 하여 보죠 ;)

(그림분실)

보시는 바와 같이 패치 성공입니다. ;)

(정적인 그림만 봐서 어찌 아리오~~~;p)

이 명령을 바꾸면 되는것이 확인 되었음으로,

exe 메모리 패치 형태로 만드셔도 되고,

dll파일을 직접 수정해 넣어도 좋을것입니다. ;)

(강좌의 성격상 맞지 않음으로 생략하겠습니다.)

어쨰든 우리는 이제 Game & Chatting 에서 도배 패치를

만드는법에 대하여 알게 되었습니다. ;)

이 글에서는 send함수를 통해 말할떄 보내지는 패킷의 구분자

@cht 문자열을 가지고 역으로 밟고 올라갔는데,

send 함수에 브레이크 포인트를 걸고 역으로 밟고 올라가도 됨을

다시 한번 확인하며 ;)

이번 글은 여기서 마치겠습니다. ;)

오늘도 즐거운 밤입니다. ;)

   

Microsoft Office OneNote 2007을 사용하여 작성했습니다.
모든 노트 및 정보를 한 곳에서 볼 수 있습니다.