처음으로 커널디버깅을 하는데 세팅하는데만 멍청한 짓을 많이해서 오래걸렸다.

윈도우 커널은 처음이라 너무 낯설었다.


Dpc에서 keyboard scan code를 check를 하는 부분이 있는데

이걸 이용한다. 

찾기만 하면 루틴나온다

사실 어떻게 리턴값이 전달되는지 이해가 안간다. 

운좋게 감으로 flag는 땄지만 device동작 원리에 대해서 좀더 공부해봐야겠다

os와 커널쪽 공부도 시간나면 해바야겠다.

'war game > reversing.kr' 카테고리의 다른 글

[reversing.kr]crc1  (0) 2017.03.16
[reversing.kr]twist1  (0) 2017.03.09
[reversing.kr]position  (0) 2017.03.09
[reversing.kr]randomware  (0) 2017.03.08

안티디버깅코드가 복잡해 보여서 


패킹 풀렸을 떄 oep를 바꿔서 덤프 떴다.


덤프 뜬 이후에도 안티디버깅 기법이 엄청 들어가있었다.

PEB 의 debugging flag를 확인하고 (fs:30)

ZwQueryInformationProcess 로 또 디버깅 유무를 체크한다. -> 참고 : http://ruinick.tistory.com/27

Getthreadcontext로 hardware bp를 체크하고 본격적인 serial루틴이다.


위의 디버깅 체크 루틴을 나는 점프해서 우회했는데 플래그를 직접수정하는 방법도 나중에 시도해 봐야겠다.

serial 분석하는데 중간에 페이크도 있고 진짜 멘탈터져서 

구글을 참고했다.


퓨 지금까지 해본 리버싱 문제중에 가장 더러웠다.

안티디버깅이 이렇게 빡칠줄은 몰랐다.

코드도 계속 바뀌고 입력값에 따라 계속 피드백을 주면서 바껴버린다.

그래서 플래그도 한번에 못찾고 계속 F2를 몇번을 눌렀는지 모르겠다.

리버싱 속도가 빨라지도록 계속 연습해야겠다.


그래도 동적분석이 조금은 익숙해진것같다.



'war game > reversing.kr' 카테고리의 다른 글

[reversing.kr]windows kernel  (0) 2017.03.17
[reversing.kr]crc1  (0) 2017.03.16
[reversing.kr]position  (0) 2017.03.09
[reversing.kr]randomware  (0) 2017.03.08

루틴>

암호화 루틴은 correct 문자열을 따라가면 바로 찾을수 있다.


4글자 소문자 name과 (5)-(5) 형식 11글자 serial을 입력받음

(name[0] name[1])

(name[2] name[3])

으로 그룹을 나누어 하위 5비트를 랜덤 인덱스로 더한다(ex name[0]의 하위 1비트 + name[1]의 하위 4비트)

그 값에다가 6을 더한값을 itoa하여 시리얼과 비교한다.

ex)


'war game > reversing.kr' 카테고리의 다른 글

[reversing.kr]windows kernel  (0) 2017.03.17
[reversing.kr]crc1  (0) 2017.03.16
[reversing.kr]twist1  (0) 2017.03.09
[reversing.kr]randomware  (0) 2017.03.08

분석하면 key를 순환하면서 file을 읽어들여 xor한다.

readme.txt에서 file은 .exe라고 했으니 .exe 포멧임과 exe파일의 널바이트 공간을 참고해서 키를 게싱했다.


encoding decoding에서 고생했다.ㅠ


from codecs import *
import binascii
f=open('./file','rb')
f2=open('./decfile','wb')
#cont=f.read()
key='93 9A 8B 8C 8F 93 9E 86 9C 97 9A 8C 8C 93 9A 8B 8C 8F 93 9E 86 9C 97 9A 8C 8C'.split(' ')
i=0
keylen=len(key)
for i in range(21780):
	a=f.read(1)
	a=int(binascii.hexlify(a).decode(),16)
	k=int(key[i%keylen],16)
	d=a^k
	print('{} ^ {} = {}'.format(hex(a),hex(k),hex(d)))
	f2.write(bytes.fromhex(hex(d)[2:].rjust(2,'0')))
f2.close()

'war game > reversing.kr' 카테고리의 다른 글

[reversing.kr]windows kernel  (0) 2017.03.17
[reversing.kr]crc1  (0) 2017.03.16
[reversing.kr]twist1  (0) 2017.03.09
[reversing.kr]position  (0) 2017.03.09

+ Recent posts