Upload
sehyeon-nam
View
44
Download
8
Embed Size (px)
Citation preview
Game Programing Gems[1.11] 온라인게임을위한프로토콜
2015 – 07 – 02 NHN NEXT 남세현
대부분의암호화기술은“신뢰된송신자와신뢰된수신자가
신뢰되지않은네트워크망을통해정보를주고받을때”를고려함.
근데온라인게임에서는
수신자 (서버) 는신뢰됨.
허나송신자는신뢰안됨.
더큰문제는, 해커들이리버스엔지니어링으로클라이언트프로그램을뒤집어까볼수있다는거임.
100% 안전한길은없다완벽하게지키는방법은없다 – Prof. SM9
대신
공격하기어렵게, 귀찮게만들순있다!
( 공격성공률을낮춰피해를없게만들고공격이들어오는걸확인하면
그사람을 ‘운영’적으로조지는게제일확실한방법. 뭐.. 고소한다던가. )
단어정의패킷
◦ 알죠? 찡긋^^
헤더◦ 알죠? 찡긋^^
페이로드 (= 바디)◦ 알죠? 찡긋^^
수비 1. 페이로드조작막기대부분의해커들의공격방법
1. 패킷조금수정해서보냄.
2. 무슨일이발생하는지봄.
3. 오호!
이것을막는방법중하나는CheckSum◦ 알죠? 찡긋^^
수비 1. 페이로드조작막기CheckSum◦ 전체바이트의값들을더한값(SUM)
에이이건뚫기가너무쉽잖아?◦ 저 Sum 값을해싱해서보내기. MD5같은거
수비 1. 페이로드조작막기CheckSum
약점
1. 리버스엔지니어링◦ 어떻게 CheckSum 만들었는지코드가다보임.
2. 유효한패킷하나를잡아내고, 그걸계속보낼수있음 -패킷리플레이
수비 2. 패킷리플레이Packet Replay
평화로운 N 모회사. 오늘도활기차게출근한변태남모군은클라이언트공격부분을구현했습니다.
If( 지난공격한지 (1/공격속도)초보다넘었으면)◦ { 서버에공격명령패킷을날림 }
그리고서버에서는공격명령패킷이올때마다공격퓩퓩퓩땅땅땅빵!
수비 2. 패킷리플레이Packet Replay평화로운 N 모회사. 오늘도활기차게출근한변태남모군은클라이언트공격부분을구현했습니다.
If( 지난공격한지 (1/공격속도)초보다넘었으면)
◦ { 서버에공격명령패킷을날림 }
그리고서버에서는공격명령패킷이올때마다공격퓩퓩퓩땅땅땅빵!
해커가공격패킷을 1초에 10번날리면?
X됨. 에이~ 요즘에그런서버가어디있어? 아직도있다고함. 알콜코더님트윗에서봄
수비 2. 패킷리플레이가장기본적인수비방법◦ 서버에똑같은로직넣어서처리하기.
◦ (아직쿨탐안끝났으면패킷무시)
근데문제가있음◦ 네트워크문제로패킷이뭉쳐서오면?
◦ 정상패킷을비정상으로오인할수있음.
수비 2. 패킷리플레이더나은수비방법◦난수생성기
패킷안에난수를넣어서보냄.
아래둘은같은종류의패킷이지만, 난수가다름
공격 : X가 Y를 Z만큼쾅!난수 : 1155
공격 : X가 Y를 Z만큼쾅!난수 : 3421
수비 2. 패킷리플레이순서
1. 보낼패킷하나를만듬.
2. 난수생성기에서만든난수를패킷에넣음. 난수만들기귀찮으면 1씩증가시켜도됨. ㅎㅎ
3. 난수생성기는다음난수를만듬.
서버도난수생성기를똑같이만듬.
똑같이난수만들면서, 와야할난수가제대로왔는지확인함.
수비 2. 패킷리플레이역시약점이있다
1. 시드(Seed) 동기화문제◦ 시드를고정시키면해커가금방찾아냄.◦ 서버에서난수를결정해서보내주자.
2. 난수머신동기화문제◦ 패킷이드랍되면?◦ 서버에서판단해서계산. 정말드랍때문인
지판단.◦ 아니면 TCP 쓰세요님들아
수비 2. 패킷리플레이3. Rand()는너무약해요.
◦ 수많은질좋은 Random 함수가있음. 구글링ㄱㄱ
4. 하지만.. 역시나리버스엔지니어링에취약함.
◦ 워쩔수없어.◦ 그래서돈을많이벌려면리버스엔지니어링을배우세요.
수비 N. 추가적인기법아이디어해커에게혼란을주기위해서는동일한페이로드(바디)를가진두패킷을다른모양처럼보이게만들어야한다.
구현난수만든거있죠? 그걸로클라에서 XOR 연산을시키자.
서버에서는복구하고.
수비 N. 추가적인기법물론해커가눈치챌수있다.
1. 패킷크기가똑같아서
◦ -> 똑같은종류의패킷이라도패킷뒤에의미없는
더미데이터붙여서문제해결가능.
◦ ->->근데별로비추. 패킷크기증가 == 비용증가
2. 리버스엔지니어링을통해서
수비 N. 추가적인기법물론해커가눈치챌수있다.
하지만그건크게중요하지않다.
핵심은 ‘해커가혼란스럽게하기’ 이다.
다시말하지만, “완벽한수비”는없다
본질적인한계본질적인한계
◦ 코드자체가클라이언트프로그램에들어있다.
역시나, 아이디어는똑같다. 혼란스럽게하자.◦ 코드자체가클라이언트프로그램에있지만,
◦ 그거분석하기어렵게만들자. – 코드암호화, 심볼제거등
◦ 혹시해커가분석했으면?◦ 채용해라.
아니면핵심코드들은서버에서돌리도록하자.◦ (사실굉장히당연한부분)
결론치팅을아예불가능하게만드는것?◦너무소모적이며불가능할수도있다.
그러므로,
치팅에드는노력을최대한크게(엄두를내지못할정도로)하는것을목표로삼는것이현실적이다.
요약 : 못막아. 근데귀찮게해봐.