'Wargame/CodeEngn'에 해당되는 글 30건

 

키젠문제인데 올리로 알고리즘 분석할랫더니 생각보다 복잡해서 ida로 봤는데도 생각보다 많이 헤맸다.

 

핵심 함수. (check_serial함수)

 

 

index값 구해오는 사용자 정의함수 구조(stringFindSecond함수)

 

 

list = "01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"

strings = "AJXGRFV6BKOW3Y9TM4S2ZU I70H5Q81PDECLNAJXGRFV6BKOW3Y9TM4S2ZU I70H5Q81PDECLNAJXGRFV6BKOW3Y9TM4S2ZU I70H5Q81PDECLN"

serial = "WWWCCCJJJRRR"

result = []

for j in range(0,12,3):
first_index = strings.find(serial[j]) + 1
result1 = strings[first_index:].find(serial[j]) + first_index
for i in range(0,len(list)):
first_index = strings.find(list[i]) + 1
result2 = strings[first_index:].find(list[i]) + first_index
if abs(result2 - result1) <=5:
print str((j+1)/3+1)+"th name = " + list[i]

ida로 확인한 뒤 요런식으로 브루트 포싱해주는 코드짜서 돌리면 name의 각자리수별로 가능한 문자들이 나오는데 정답중 0~9,a~z,A~Z 순서상 가장 먼저 오는 문자열 구하래서 맨위의 문자들 조합해주면 된다.

 

 

 

'Wargame > CodeEngn' 카테고리의 다른 글

CodeEngn advance 9번  (0) 2018.02.28
CodeEngn advance 8번  (0) 2018.02.28
CodeEngn advance 7번  (0) 2018.02.28
CodeEngn advance 6번  (0) 2018.02.08
code engn advance 5번  (0) 2018.02.08
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

프로그램을 실행해보면 키값을 찾으라고 한다.

 

 

분석을 해보면 아이디 패스워드를 입력받은 후 특정 함수 내부로 들어가는데 총 3가지값을 비교한다.

 

1. 아이디값과 NULL값을 비교.

 

2. 패스워드값을 hex로 변경하여 특정 hex값과 비교.

 

3. 다시 아이디값과 특정 문자열 비교.

 

여기서 1,3이 모순이되는 관계여서 1번 비교할때 강제로 NULL값에 내가입력한 아이디값 넣어서 참이 나오게 만들어서 진행했다.

 

1번째

 

2번째

 

3번째

 

 

 

 

'Wargame > CodeEngn' 카테고리의 다른 글

CodeEngn advance10번  (0) 2018.03.02
CodeEngn advance 8번  (0) 2018.02.28
CodeEngn advance 7번  (0) 2018.02.28
CodeEngn advance 6번  (0) 2018.02.08
code engn advance 5번  (0) 2018.02.08
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

간단한 키젠 문제.

 

 

 

총 4개의 키젠 생성 구문이 있음.

 

근데 첫번째 키 생성 루틴에 전체 Name값이 다 사용되고 일치하는 값을 구했을때 중복되는 값들이 없어서 나머지 키 생성 루틴을 분석할 필요가 없었음. 맨 앞의 5D88을 만드는 키 생성루틴을 그대로짜서 브루트포싱으로 구했음.

 

 

serial = "5D88"
strings = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

def carry(result):
if len(result) > 10:
result = result[0:2] + result[len(result) - 9:len(result) - 1]
return result

for i in range(0,len(strings)):
for j in range(0,len(strings)):
name = strings[i]+strings[j]
result = "0x00"
for k in range(0,2):
result = hex((int(result,16)+int("0x"+name[k].encode('hex'),16))*0x772)
result = carry(result)

tmp = result
result = hex(int(result, 16) * int(result,16))
result = carry(result)

result = hex(int(result, 16) + int(tmp, 16))
result = carry(result)

result = hex(int(result, 16) *0x474)
result = carry(result)

result = hex(int(result, 16) * 0x2)
result = carry(result)
if result[2:6].lower() == serial.lower():
print "[*]Name = " + name
break

 

 

'Wargame > CodeEngn' 카테고리의 다른 글

CodeEngn advance10번  (0) 2018.03.02
CodeEngn advance 9번  (0) 2018.02.28
CodeEngn advance 7번  (0) 2018.02.28
CodeEngn advance 6번  (0) 2018.02.08
code engn advance 5번  (0) 2018.02.08
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

CodeEngn advance 7번

2018. 2. 28. 13:31

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.


군생활 구하면 된다.


실행해보면 확인버튼 누를때마다 1씩 증가한다. 군생활 일수만큼 증가하면 될 것 같다.

안티디버깅 걸려있다. EAX값 바꿔서 우회하면 된다.

그다음 메시지 박스 띄우는 부분에 일수값이 인자로 들어갈거기 때문에 모든 메시지 박스 띄우는 함수에 BP걸고 돌렸더니 다음부분이 나왔다.

일수값이 세팅된 023EE970 영역에 하드웨어 BP걸고 값이 증가하는 부분을 찾아봤다.

해당 영역에서 값이 1증가한 상태로 잡히는걸 볼 수 있고 008BF820 지점에서 이미 증가한 값이 세팅된 체로 존재해 해당 지점에 다시 하드웨어 BP걸고 돌려봤다.

쭉 트레이싱 하다 보면 다음 포인트에서 값이 증가되어있는데 해당 지점에 오기전에 이미 EAX값에 증가된 값이 세팅되어 있기 때문에 스택 참고해서 해당 지점 호출하는 곳으로 가봤다.

위의 사진부분을 콜하는 함수 지점인데 위쪽을 보면 EAX값 세팅할때  참조하는 메모리 주소를 보니 008BF808이란 지점이었고 이 지점에 하드웨어 BP 걸고 다시 돌려봤다.

 

쭉 트레이싱하다보면 해당지점에서 PUSH EAX로 하드웨어 BP 걸어논 메모리에 증가된 값이 들어오고 ECX값이 세팅되는 023EE920을 다시 하드웨어 BP걸고 돌려봤다.


다시 트레이싱 하다보면 다음지점에서 EBX값의 메모리주소 영역에 EDX에서 세팅된 값이 들어오는데 EDX값은 EDI값의 메모리주소영역인 023E4FB8의 들어있는 값으로 세팅되었었다. 023E4FB8 지점에 다시 하드웨어 BP를 걸고 돌려봤다. 

해당 지점에서 멈추는데 LEA EBP, [EDI+EAX] 부분을 통해  1 증가된 값이 세팅되었다. 드디어 값이 최초로 세팅되는 지점을 찾았고 그럼 이 함수 부분이 리턴되고나서 이 증가된 값을 기준 군대날과 비교해서 프로그램 실행흐름이 나뉘어질거라고 생각했다.

쭉 트레이싱하다보면 리턴 후 다음 부분에서 ESI에 담긴 증가된 값을 EAX에 넣은 후 EBP에 있는 값(790일)과 비교하는걸 볼수 있었다. EAX값을 791로 바꿔서 원래 흐름과 다르게 점프하도록 해봤더니 메시지 박스가 안뜨고 프로그램이 종료된걸 확인할 수 있었다.

790을 md5로 바꿔서 인증해봤더니 정상적으로 인증이 되었다.


'Wargame > CodeEngn' 카테고리의 다른 글

CodeEngn advance 8번  (0) 2018.02.28
CodeEngn advance 7번  (0) 2018.02.28
code engn advance 5번  (0) 2018.02.08
code engn advance 4번  (0) 2018.02.08
code engn advance 3번  (0) 2018.02.08
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

code engn advance 5번 문제다.

키값 구하면 될 것 같다.

키값이니 또 비교하겠지. 함수보니 vbaStrCmp 또 너다.

입력값에 123주고 실행해보니 다음과 같이 내가입력한 값과 비교값이 나타난다.

 


저 값을 주고 다시 실행해봤다.

성공!


'Wargame > CodeEngn' 카테고리의 다른 글

CodeEngn advance 7번  (0) 2018.02.28
CodeEngn advance 6번  (0) 2018.02.08
code engn advance 4번  (0) 2018.02.08
code engn advance 3번  (0) 2018.02.08
code engn advance 2번  (0) 2018.02.05
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

code engn advance 4번 문제다.

문제가 다 고만고만하다. 

먼저 실행해보면 약간의 언패킹이 걸려있는 것 같다. 

F8로 하나씩 실행해보면 저 점프문에서 엄청위로 올라간다.

이부분이 OEP다 다시 덤프뜨고 실행해봤다.

Istrcmp에 BP걸고 위에처럼 값줘보니 다음과 같이 내가 준 값과 비교하는 값이 보인다.

이정도로 같은 유형을 반복시키면 이제 초등학생도 풀 수 있을 것 같다. 

성공!


'Wargame > CodeEngn' 카테고리의 다른 글

CodeEngn advance 6번  (0) 2018.02.08
code engn advance 5번  (0) 2018.02.08
code engn advance 3번  (0) 2018.02.08
code engn advance 2번  (0) 2018.02.05
code engn advance 1번  (0) 2018.02.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

code engn advance 3번 문제다.

basic에서 많이 보던 유형이다. CodeEngn에 해당하는 시리얼값 구하기.

패킹은 따로 안되어있고 열어서 함수부분을 확인해봤다.

떡하니 BP걸어달라고 기다리고 있는 너. 이름에 해당하는 시리얼값 구할때 저기서 비교할 확률이 상당히 높다.

이렇게 넣어주고 돌려봤다.

먼저 들어간 값은 내가준 시리얼값 그다음은 내가 준값이랑 비교할 값.

여기까지만해도 다들 눈치채셨을것같다.

아직까진 advance랑 basic이랑 다를게 없는 것 같다.


'Wargame > CodeEngn' 카테고리의 다른 글

code engn advance 5번  (0) 2018.02.08
code engn advance 4번  (0) 2018.02.08
code engn advance 2번  (0) 2018.02.05
code engn advance 1번  (0) 2018.02.04
code engn basic 20번  (0) 2018.02.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

codeengn advance 2번 문제다.

흠 문제만 봐선 모르겠다 파일부터 실행해보자.

실행시켜 보니 비밀번호를 맞추면 되는 것 같다. 

패킹은 따로 안되있어 그냥 열어봤다.

먼저 키입력하는 문자열을 찾아 주변 함수에 BP 걸고 F8로 하나씩 실행하면서 흐름을 파악해봤다.

그랬더니 별다른 분기점은 없고 CALL EDX라는 함수에서 프로그램이 종료된다.

함수 내부로 들어가봤다.

들어가보니 저 많은 JNZ 구문을 통해 프로그램이 종료되는 함수가 호출된다.

크랙하지 않았을때 흐름이 점프가 이루어져 프로그램 종료함수위치로 갔기 때문에 저 점프문들을 모두 통과하면 정상적으로 해결 될 것 같다. 그렇다면 CMP문에서 비교하는 ECX의 값이 중요한데 처음 비교 하는 ECX값을 보니 내가입력한 값의 첫번째 byte를 16진수로 반환한 값이었다.

그렇게 첫번째 점프문 안으로 들어오면 MOVSX ECX,BYTE PTR DS:[EAX+1]을 통해 한 바이트가 더 증가되 2번째, 3번째 ,4번째 바이트 순서로 비교하게 된다. 그렇다면 이제 해야할일은 간단하다. 비교값에 맞게 키 값을 구해봤다.

마지막 0 값은 문자열을 입력했을때 처리되는 null값으로 따로 처리해주지 않아도 될 것 같다.

한번 입력을 해봤다.

성공! 아직 초반이라 문제가 쉬운 것 같다. 


'Wargame > CodeEngn' 카테고리의 다른 글

code engn advance 4번  (0) 2018.02.08
code engn advance 3번  (0) 2018.02.08
code engn advance 1번  (0) 2018.02.04
code engn basic 20번  (0) 2018.02.04
code engn basic 19번  (0) 2018.02.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

code engn advance 1번 문제다.

문제가 basic 19번 문제와 똑같다. 내부와도 같을지 궁금하다.

열어보니 같은 내용에 그냥 값만 다르다. 
http://blog.naver.com/dudtls8503/220893097300

문제와 같은 방식으로 풀어준 후 인증할때 md5값으로 바꾸기만 해주면 될 것 같다.

첫번째 문제라 그냥 복습 시켜주나보다.


'Wargame > CodeEngn' 카테고리의 다른 글

code engn advance 3번  (0) 2018.02.08
code engn advance 2번  (0) 2018.02.05
code engn basic 20번  (0) 2018.02.04
code engn basic 19번  (0) 2018.02.04
code engn basic 18번  (0) 2018.02.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,