크기가 매우 작은 간단한 게임이다.


처음 실행 하자마자 메모리 영역을 보면 알수 없는 문자들이 있는데


몬스터를 잡다보면 이 곳이 복호화 되는 것을 확인할 수 있다.


몬스터 한마리당 한글자를 복호화 하지만 총 글자수가 50개인 반면 몬스터는 48마리 밖에 없다.


해서 패스워드 버퍼에 메모리 브레이크 포인트를 건 뒤 몬스터를 잡아보면, 특정 메모리 공간에 있는 값으로 복호화 하는 루틴을 찾을 수 있다.


다시 복호화 값으로 사용되는 값중 하나를 골라 하드웨어 브레이크를 건 뒤 프로그램을 재 실행 해보자.

초기화 과정에서 해당 브레이크 포인트에 걸리는 것을 볼 수 있다. 그게 바로 위 사진의 루틴이다.

0x210 바이트 간격으로 데이터를 저장하는데, 이 값들이 몬스터들마다 하나씩 가지고 있는 복호화 키다.

반복문을 분석하면

키값이 0x4 만큼 계속 증가한다는 것을 확인할 수 있으며 이 규칙으로 나머지 값도 알아낼 수 있다.



'취미 > WarGame' 카테고리의 다른 글

[reversing.kr] Twist1  (0) 2015.02.27
[reversing.kr] Ransomware  (0) 2015.02.24
[reversing.kr] ImagePrc  (0) 2015.02.21
[reversing.kr] Position  (0) 2013.10.30
[reversing.kr] replace  (0) 2013.10.25
Posted by $Zero
:

매우 간단한 예제니 중요한 부분만 집고 넘어가자.





체크 버튼을 눌렀을 때 실행되는 루틴인데 메모리상에 그려진 비트맵과 리소스로 읽어들인 비트맵을 비교하는 루틴이다.


처음엔 이 루틴을 넘어가면 해결이 되는 건가 싶었으나, 루틴을 통과해도 프로그램에는 아무런 변화가 없다.


해서, 해답 키는 리소스 안에 그려져 있을 거라는 생각이 들었다.


처음엔 리소스내용을 프로그램에 띄어볼까 했는데 코드 인젝션까지 하는 건 너무 번거로운 작업이 될 것 같아 리소스 데이터만 추출하기로 했다.


먼저 헥스에디터로 bmp 파일 헤더와 이미지 헤더를 복사해 넣고 리소스 데이터를  뒷부분에 넣어준다. 



방금 그림판이 만들어낸 비트맵 헤더다.

42 4D - BM (비트맵 파일 헤더의 첫 시작 PE 포맷의 PE와 같은 의미다.)

36 B8 0B 00 (헤더까지 합친 파일의 총 크기, 비트맵을 복원할땐 사용되지 않는다.)

00 00 (예약)

00 00 (예약)

36 00 00 00 (실제 이미지 데이터의 시작 오프셋)

28 00 00 00 (이미지 헤더의 크기)

80 02 00 00 ->  Width 값

90 01 00 00 ->  Height 값

01 00 18 00 00 00 00 00 00 B8 0B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00


이 헤더를 그대로 쓰면 이미지를 불러올수 없으니 Width 와 Height 를 수정하자 


80 02 00 00 -> C8 00 00 00 (ImagePrc에서 사용하는 이미지 Width)

90 01 00 00 -> 96 00 00 00 (ImagePrc에서 사용하는 이미지 Height)


헤더 수정이 끝나면 리소스에서 긁어온 이미지 데이터를 헤더 뒤에 붙여넣자.


그럼 정상적으로 bmp 이미지를 불러올 수 있고


그곳엔 키 값이 적혀있다.




'취미 > WarGame' 카테고리의 다른 글

[reversing.kr] Ransomware  (0) 2015.02.24
[reversing.kr] Direct3D FPS  (1) 2015.02.24
[reversing.kr] Position  (0) 2013.10.30
[reversing.kr] replace  (0) 2013.10.25
[reversing.kr] Easy_UnpackMe  (0) 2013.10.24
Posted by $Zero
:

회사에서 마이그레이션 테스트 서버를 만들기 위해 CentOS 6.5를 설치하던 중 만난 에러. 


이미지 파일을 Unetbootin 으로 USB에 풀고 설치시 발생.


해결법 -> 


USB에서 /repodata/TRANS.TBL 파일을 열어보면 해당 repodata폴더에 있는 파일들의 리스트와 명칭이 다르다.


/repodata 밑에 있는 md5 해쉬 값으로 된 파일 명들을 모두 TRANS.TBL 에 들어있는 목록과 일치하도록 rename 을 한 뒤 다시 설치를 시도하면 에러 없이 정상적으로 설치가 진행 된다. 




Posted by $Zero
:

삼바를 외부에서 사용하기 위해서는 서버와 139 포트로 연결이 가능해야 한다. 


삼바를 외부에서 사용하려고 할 때 몇가지 문제가 있는데, 


첫째로 윈도우는 기본적으로 139포트외에 다른 포트로 변경할 방법이 없다. 

(심지어 해당 서비스의 포트포워딩도 프로그램을 해킹하지 않는 이상 불가하다.)


둘째, 139포트는 웜바이러스가 기승을 부리던 포트라 어지간한 통신사는 라우터 자체에서 해당 포트의 사용을 막아버렸다. 


웜바이러스와는 거리가 먼, 리눅스 및 유닉스 사용자는 억울하기 그지 없는 처사다. 


그래도 다행인건 리눅스 및 유닉스는 삼바연결시 포트를 마음대로 바꿀 수 있다는 점이다. 


해서 리눅스와 유닉스는 외부에서 삼바를 사용하는 것이 크게 문제가 되지 않는다. 

단지 서버쪽 포트를 기본139가 아닌 8888과 같은 임의의 포트로 변경하고 클라이언트에서도 8888포트로 연결해서 사용하면 된다 


가장 큰 문제는 사용률이 가장 높은 윈도우에서 발생한다. 


서버측에서 포트를 변경한다 한들 윈도우즈의 네트워크 드라이브는 139포트 밖에 사용할 수 없기에 연결을 할 수가 없다. 


아직까지 내가 아는 방법은 2가지 뿐이다. 


1. 통신사측에 139포트를 열어달라고 요청하든지


2. 꼼수를 부려 윈도우즈의 139 포트 출력을 다른 포트로 포워딩 시키는 것이다. 


일반적으로 포트 포워딩은 들어오는 패킷의 포트를 내부 PC의 다른 포트로 받아들이는 것인데 


이와 반대로 내부 PC가 외부로 패킷을 보낼때 원본 패킷의 포트를 뜯어 고치는 것이다. 


윈도우즈입장에서는 139포트로 연결을 요청하면 중간에 프록시와 같은 프로그램이 연결을 가로채 139포트를 8888포트로 변경해서 외부로 보낸다고 이해하면 되겠다.


매우 귀찮고 번거롭지만 윈도우즈에서 별다른 방법이 없다. 


이 방법 역시 서버측 포트는 139가 아닌 다른 포트를 사용 해야한다. 

(139는 통신사에 의해 막혀있으므로..)



http://devbug.me/412 (해당 유틸과 사용법)





Comicglass SMB 사용 - 2016-05-30 작성 -


정말 오랜만에 SMB를 사용할 일이 생겼다.


ComicGlass의 SMB를 이용하여 내 방에 있는 NAS를 스트리밍하려고 한 것인데,


139포트가 통신사에 의해 막혀있다는 사실을 망각한 채 외부에선 왜 오류가 나지라는 의문으로 하루를 보냈다. -_-


공유기를 연결하여 포트포워딩으로 8888포트를 사용하게 했건만..


ComicGlass가 포트변경을 지원하지 않는 것 같다.

URL에 :8888을 넣어도 아무런 반응이 없다.


보안에 영 찝찝해서 잘 안쓰지만 별 방법이 없을 것 같다.


공유기의 VPN 서버를 활용하는 수 밖에...


공유기의 VPN 서버를 경유 하니 NAS에서 오픈한 SMB서버에 접속이 매우 잘 된다.


VPN서버를 열어둔다는 게 매우 찝찝하지만.. 별 방법이 없으니 - -










Posted by $Zero
:

REP = 다음에 나오는 명령어를 ECX 만큼 반복해서 수행 

REPNE, REPNZ = Zero Flag 가 0이 아니며 ECX 만큼 수행. Zero Flag가 0이되면 빠져나옴.  (Zero Flag != 0 , ECX > 0 )

REPE, REPZ = Zero Flag 0 일 경우 ECX만큼 수행. Zero Flag 가 설정되면 빠져나옴. (Zero Flag == 0, ECX > 0)

STOS = AX의 값을 EDI 주소에 저장

SCAS = AX의 값과 EDI 주소에 있는 값과 비교 

SCASB = SCAS 를 byte 단위로 비교 

SCASW = SCAS 를 word 단위로 비교 

SCASD = SCAS 를 DWORD 단위로 비교

LODS = ESI 가 가리키는 메모리의 값을 읽어 EAX로 복사 (STOS와 같이 b,w,d 의 단위 연산자가 있음)

LOOPD = ECX만큼 피연산자의 주소로 goto 하는 명령

ROL = 왼쪽으로 shift(<<) 명령 최상위 비트가 오른쪽 끝으로 이동

SHR = 왼쪽으로 shift(<<) 명령 최상위 비트가 CF 로 이동 


LODSB/LODSW/LODSD (Load String Byte/Word/Double) 바이트/워드/더블워드의 자료를 esi가르키는 곳으로 부터 읽어와서 al/ax /eax 레지스터에 전송시킨다. 전송된 후 esi는 다음번 문자열 요소를 가르 키도록 갱신되는 데, df이 0이면 1/2/4만큼 증가되고, df가 1이면 1/2/4 만큼 감소된다.



----JMP----


JL(Jump if Less) = (SF!=0F) 비교 결과가 작으면 점프. 

JLE(Jump if Less or Equal) =  (ZF=1 or SF!=0F) 비교 결과가 작거나 같으면 점프.

JNE(Jump if Not Equa) = (ZF=0) 비교 결과가 다르면 점프.

JNB(Jump if Not Below) = (CF=0) 비교 결과가 크거나 같으면 점프.

JBE(Jump if (unsigned) below or Equal) CF=1 or ZF=1

JB(Jump if Below) = (a < b) 뒤의 피연산자의 값이 클 경우 점프

JA(Jump if Above) = (a > b) 앞의 피연산자의 값이 클 경우 점프 (CF=0 and ZF=0)

JG(Jump if Greater) = (a > b) 왼쪽 인자의 값이 오른쪽 인자의 값보다 크면 점프 (ZF=0 and SF=0F)



----PUSH & POP----


PUSHFD = 플래그 레지스터를 스택에 저장 

PUSHAD = 모든 레지스터를 스택에 저장.

POPAD = PUSHAD로 저장된 레지스터를 모두 복원

POPFD = 스택에서 플래그 레지스터 복원

PUSHA,POPA : 16bit 버전 


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


CLI = 인터럽트 플래그를 0으로 만든다. (인터럽트 무시)

STI = 인터럽트 플래그를 1로 만든다. (인터럽트 허용)




Posted by $Zero
:

mysql 데이터베이스의 user 테이블에 host,user 정보 insert되었는지 확인 후

flush privileges;  로 변경 권한 적용(혹은 mysql reload)

/etc/mysql/my.cnf 에 bind-address 설정이 있는지 확인.

있다면 해당 줄 주석처리. 

Posted by $Zero
:





한글이 insert 가 안되는 경우는 100% character set 문제다. 

비록 server , client , database, table, connection 모든 character set 을 utf8로 변경했다 하더라도 


latin1 상태에서 만든 테이블은 각 컬럼들이 여전히 latin1로 남아있다. 


각 컬럼에 스샷과 같이 alter 명령으로 character set 을 utf8 로 바꿔주면 한글이 정상적으로 잘 입력된다. 

'레퍼런스 > DB' 카테고리의 다른 글

[mysql] 원격접속이 안되는 경우.  (0) 2014.02.21
[Oracle] Oracle 설치시 DISPLAY 변수 문제  (1) 2013.08.30
Posted by $Zero
:

cron 의 로그는 syslog가 관리하며


sudo grep CRON /var/log/syslog 로 확인 할 수 있다. 


Posted by $Zero
:

TOMCAT_HOME/lib/el-api.jar 


파일을


JAVA_HOME/jre/lib/ext 폴더에 복사




'레퍼런스 > API' 카테고리의 다른 글

[winAPI] ReadProcessMemory  (1) 2013.09.14
[winAPI] ProcessToken, AccessToken  (0) 2013.09.12
[winAPI]GetModuleFileName 함수  (0) 2013.09.02
[winAPI] DllMain 정의  (0) 2013.09.02
[winAPI] ListBox 여러개 삭제, 멀티 셀렉트 삭제  (0) 2012.05.30
Posted by $Zero
:

[reversing.kr] Position

취미/WarGame 2013. 10. 30. 17:09 |

드디어 분석 완료 . 


내용이 너무 방대한 관계로 파일로 대체합니다. 



Position.udd


Position.bak


(Position.exe 파일을 바탕화면에 position 폴더를 만들고 그 안에 넣어서 분석하세요 !! udd파일에 파일경로가 저장되어있어서 다른 경로의 position 파일을 열면 새로운 udd파일을 리네임해서 생성해버립니다. 분석에 사용된 OS는 win XP SP3 입니다.)



position.c


(디스어셈 내용 소스로 만든 파일)

똑같은 알고리즘을 그대로 구현한 소스와 position을 분석하면서 comment 를 달아놓은 udd파일 첨부 .

(serial key 알고리즘 부분에 세세하게 coment 다 달아놨습니다. 소스와 함께 보셔야 이해가 되실거에요 .. 코딩도 날코딩이라 알아보기 힘드셔도 양해 바랍니다 ㅠ.ㅠ)


(실제 디스어셈에선 SEH예외처리도 사용되고 갖가지 예외와 문자열 사이즈를 확인하는 등 각종 연산들이 있지만 중요하지 않은 정보라 포함시키지 않았습니다. 사실 저도 문자열 사이즈가지고 무슨 연산을 하는지는 잘 모르겠네요. 그 부분들은 전부 comment 에 Unknown 이라고 표시해뒀습니다.) 


예제 값 


name : zero 

serial : 77777-77778 


올바르지 않은 serial 일경우 각종 비교문에 의해 알고리즘 루틴을 확인하기 힘드니 첫 분석이시라면 이 값을 쓰시길 권장합니다 

혹은 소스를 컴파일해서 name값으로 serial key 를 얻은후 그 값으로 디버깅 해보셔도 됩니다 ! 



이 프로그램의 알고리즘은 소스코드에 나온 그대로이구요 


순서대로

0-4 

>> 비트 연산 

& 1 연산

+5 혹은 ++ 연산이 전부입니다. 


name문자열을 2개씩 2개의 그룹으로 (zero 가 입력되면 ze, ro 를 나눔)  쪼개서 

데이터값들을 추출합니다. 


소스의 nameData1,2 ,3 ,4 버퍼들이


디스어셈을 통해 얻은 알고리즘 그대로 적용시켜 추출한 데이터값입니다. 


이 데이터들을 


0 - 2 

3 - 3 

1 - 4

2 - 0

4 - 1


nameData1,2 와 nameData3,4 를 name처럼 그룹으로 묶어 


위에 적은 index끼리 ADD연산을 합니다. 


그리고 이게 바로 serial key 값이죠. 


첨부한 소스를 컴파일하고 실행해보면 입력된 name 값에 따른 serial key 를 만들어서 출력해줍니다 




전 이제 이 데이터들로 문제가 제시한 


76876-77776 serial 값을 갖는 name을 찾아봐야겠습니다. -_-. 


추출된 5가지의 데이터는 결국 0아니면 1 (and 1 을 하므로) 

거기에 ++냐 +5 의 차이일뿐 즉 데이터는 전부 

1,2 혹은 5,6 이라는 거지요 . 

이 값들을 더해서 나올수 있는 조합은 기껏 해봐야 


6, 7 , 8 세가지 입니다. 


조금만  고민해보면 그 name값을 찾는 알고리즘을 작성할 수 있을것 같은데 


기어코 브루트 포싱을 쓰지 않고 해보려 합니다 - - ^ 


는.. 손실 알고리즘은 도저히 어떻게 못하겠군요 -_-; 그냥 브루트포싱을 써야겠습니다 !! 


그래도 나름대로 추출한 알고리즘을 기반으로 하는 브루트 포싱이니 알고리즘 기반이라는 것에서 위안을 삼아야 겠네요 


마지막 문자는 p라고 readMe에 있었으니 

나머지 3문자를 3중첩 for문으로 소문자 알파벳 3자리를 생성해서 쭉 돌려 만들어진 serial key 와 

문제의 serial key를 비교하면 문제 해 결 ! 






'취미 > WarGame' 카테고리의 다른 글

[reversing.kr] Direct3D FPS  (1) 2015.02.24
[reversing.kr] ImagePrc  (0) 2015.02.21
[reversing.kr] replace  (0) 2013.10.25
[reversing.kr] Easy_UnpackMe  (0) 2013.10.24
[reversing.kr] 2번 문제 Easy_keygen  (0) 2013.10.23
Posted by $Zero
: