정답이 무엇이냐는 문제 입니다.


이문제에는 함정이 있어요


함정이....



일단 입력 하는 곳으로 따라가 보았습니다.



문자열을 입력 하고 출력한다음 어떤 루프가 있습니다.



이 루프들은 모두 속임수 입니다.


밑에 call edx


라고 비교문이 있습니다.





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

codeengn) advance 01  (0) 2014.12.07
codeengn) basic 19  (0) 2014.12.07
codeengn) advance 05  (0) 2014.11.30
codeengn) advance 4  (0) 2014.11.30
codeengn) advance 3  (0) 2014.11.30
Posted by 준P



몇 밀리세컨드에 종료 되는지 알아내는 문제 입니다.



upx로 패킹되어 있네요


대충 언팩 해줍시다.


무엇으로 패킹되었는지는 알수 없습니다.


바로그냥 하시면 됨니다.



timegettime은 sleep문을쓸떄 몇 밀리세컨드를 중지 할것인지 리턴하는 함수 입니다.



리턴값은 eax에 보통 저장됨니다.


허나 바로 esx를 쓰는 레지스터는 없습니다.


천천히 디버깅 해보겟습니다.


jnb를 따라가도록 하져



드디어 eax를 사용하는 함수가 나왔습니다.



분기점 입니다.


337b가 sleep에 들어가는 시간 입니다.


md5 hash로 변환후 인증해야 합니다.





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

codeengn) advance 02  (0) 2014.12.07
codeengn) basic 19  (0) 2014.12.07
codeengn) advance 05  (0) 2014.11.30
codeengn) advance 4  (0) 2014.11.30
codeengn) advance 3  (0) 2014.11.30
Posted by 준P



프로그램이 몇 밀리세컨드후에 종료 되는지 알아내는 문제 입니다.


timegettime함수는 sleep함수 호출시 몇 밀리세컨드를 중지할것인지 리턴하는 함수 입니다.


이 리턴값을 알아내면 됨니다.




패킹은 어떻게되었는지 알순 없군요



시스템 콜을 찾아서 보니 여러 timegettime함수가 호출됨니다.


모두bp를 걸고 run해줍시다.



일단 리턴값이니 call을 따라 들어갈 필요는 없습니다.


리턴값은 eax에 보통 저장됨니다.


eax를 사용하는 레지스터가 없으니 천천히 디버깅 해봅시다.


jnb를 따라가면 다음과 같이 나옴니다.



여기서 내려가면 분기점이 있습니다.



2b70이 값입니다.


16진수 이니 10수로 변환 후 인증 해야 합니다.




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

codeengn) advance 02  (0) 2014.12.07
codeengn) advance 01  (0) 2014.12.07
codeengn) advance 05  (0) 2014.11.30
codeengn) advance 4  (0) 2014.11.30
codeengn) advance 3  (0) 2014.11.30
Posted by 준P



시리얼을 구하는 문제 입니다.



비주얼 베이직으로 제작되었고요



함수를 검색해보니다.


문자열 비교 함수가 있습니다.


여기에 Bp를 걸고 실행해 보았습니다.



에구구 엄청 작네요


저는 대충 시리얼을 crasy로 하였습니다.



677345가 시리얼 이네요




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

codeengn) advance 01  (0) 2014.12.07
codeengn) basic 19  (0) 2014.12.07
codeengn) advance 4  (0) 2014.11.30
codeengn) advance 3  (0) 2014.11.30
codeengn) basic 20  (0) 2014.11.28
Posted by 준P



 name이 CodeEngn일때 시리얼키를 구하는 문제 입니다.



열어봤더니 아무것도 찾으수 없다고 합니다.



그런데 프로그램에서 어셈블리어로 제작되었다고 자진신고 해주는 군요



올리디버거로 열어보았습니다.



천천히 디버깅중인데 반복문이 나옴니다.


생각해보니 어셈블리어로 제작되었는데 왜 아무것도 찾을수 없었을까요?


제생각에는 이반복문은 디코딩 루프 입니다.



jmp부분에 bp를 걸고 f9해보았습니다.


그리고 f8으로 점프하였습니다.



여기가 oep인거 같습니다.


여기서 덤프를 하겟습니다.



리빌드는 필요 없습니다.


덤프후 실행 해봤습니다.



정상적으로 실행됨니다.



패킹이 정상적으로 풀렷습니다.



문자열 중에 상공문자열을 따라가 봤습니다.



살짝 올려보니 문자열 비교문이 있습니다.



bp를 걸고 실행 해보았습니다.



이름은 CodeEngn 시리얼은 crasy로 하였습니다.



시리얼은 LOD-59919-A0024900 였습니다.




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

codeengn) basic 19  (0) 2014.12.07
codeengn) advance 05  (0) 2014.11.30
codeengn) advance 3  (0) 2014.11.30
codeengn) basic 20  (0) 2014.11.28
codeengn) basic 17  (0) 2014.11.27
Posted by 준P



이름이 CodeEngn일때 시리얼 값을 구하는 문제 입니다.



어셈블리로 컴파일되었네요



열자마자 바로 DialogBoxParam 함수가 보임니다.


이함수에 입력한 값을 얻을려면 getDlgitemText함수가 필요 합니다.


따라서 검색


첫번쨰는 아마 Name을 가져올것입니다.



따라서BP를 걸고 실행합니다.



저는 이름을 CodeEngn으로하고 시리얼은 crasy로 하였습니다.


그런데 바로 밑에 분기점이 있습니다.


이분기점은 문자열이 3자리 이상이면 바로 종료 해버림니다.


CodeEngn은 8자리 입니다.


따라서 수정을 해야 합니다.



CodeEngn자리수인 8로 수정합니다.


수정후 바로 시작


정상적으로 넘어 감니다.



밑에 문자열을 비교하는 함수가 있네요


시리얼은 3265754874 입니다.




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

codeengn) advance 05  (0) 2014.11.30
codeengn) advance 4  (0) 2014.11.30
codeengn) basic 20  (0) 2014.11.28
codeengn) basic 17  (0) 2014.11.27
codeengn) basic 18  (0) 2014.11.27
Posted by 준P




이번 문제는 key파일에 들어갈 키 값을 구하는 문제 입니다.



일단 CRACKME3.KEY 라는 파일이 필요합니다.



그리고 그 key 파일이 18(12)만큼의 바이트가 있는지 확인 합니다.


12는 헥스코드로 10진수로는 18입니다.


게속 디버깅 해봅시다.




다음과 같은 알고리즘이 나왔습니다.


이 알고리즘은 한자리씩 A~O까지 xor연산을 하는 알고리즘 입니다.


이걸 c언어로 해석해 보았습니다.


일단 key는 대충 123456789123456789로 18자리로 마추었습니다.



이거 푸는데 3일 걸렷다죠 하핫


이 알고리즘은 XOR연산을 한뒤에 연산값을 누적시키는 특징이 있습니다.


이 값하고 나머지 4자리 값하고 같아야 합니다.


그리고 리턴후에 밑에 있는 함수로 가게 됨니다.



이 함수는 나머지 4자리수를 가져오는 함수 입니다.



cmp로 나머지 4자리수와 비교를 합니다.


이제 key값을 알아야 합니다.


key값은 메세지 박스가 출력될떄 CodeEngn!이 되어야 합니다.


따라서 저는 CodeEngn!을 A~O까지 한글자씩 XOR연산을 해서 값을 구해주었습니다.


그리고 올리디버거로 열어서 나머지 4자리 값을 알아냈습니다.



key 값을 저장하고 실행 하였습니다.





그런데 이 문제는 인증이 잘되지 않습니다.


key값중에서 사용하지 않는 값이 있을수 있기 때문 입니다.


따라서 비공개로 게시글을 올려서 인증을 해야 합니다.


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

codeengn) advance 4  (0) 2014.11.30
codeengn) advance 3  (0) 2014.11.30
codeengn) basic 17  (0) 2014.11.27
codeengn) basic 18  (0) 2014.11.27
codeengn) basic 16  (0) 2014.11.24
Posted by 준P



key값이 BEDA-2F56-BC4F4368-8A71-870B일떄 name을 구하라는 문제 네요



따로 패킹되어 있지 않습니다.



문자 하나를 대충 입력하고 키 값을 넣었습니다.



더많은 문자를 입력하라고 하네요


name의 문자열 길이를 비교하는 함수가 있다는 것 입니다.BEDA-2F56-BC4F4368-8A71-870B


문자열을 검색해 봣습니다.



바로 있네요 ㅎㅎ


따라가서 1개 이상으로 


바꿔줘야  합니다.



cmp문으로 문자열의 개수를 비교하는것이 보임니다.


저는 이걸 수정 해서 파일로 만들겟습니다.


이제 저장 합니다.



저장을 한뒤에는 한글자만 입력해도 딱히 문제가 생기지 않습니다.


이제 A~Z a~z 0~9까지 대입하면 됨니다.


답은 F입니다.


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

codeengn) advance 3  (0) 2014.11.30
codeengn) basic 20  (0) 2014.11.28
codeengn) basic 18  (0) 2014.11.27
codeengn) basic 16  (0) 2014.11.24
codeengn) basic 15  (0) 2014.11.24
Posted by 준P



이름이 CodeEngn 일때 시리얼키를 구하는 문제 입니다.



exe쉴드라고해서 딱히 언패킹 할필요는 없네요 하핫



웬지 모르게 분기점이 있을거 같은 곳으로 이동 합시다.



문자열을 비교하는 함수가 있습니다.


bp를 걸고 f9실행 합시다.


이름은 CodeEngn


시리얼은 crasy로 하엿습니다.


두 문자열을 비교 합니다.


06162370056B6AC0 하고


제가 입력한 crasy를 비교하는 군요


인증 중....

맞았네요




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

codeengn) basic 20  (0) 2014.11.28
codeengn) basic 17  (0) 2014.11.27
codeengn) basic 16  (0) 2014.11.24
codeengn) basic 15  (0) 2014.11.24
codeengn) basic 14  (0) 2014.11.24
Posted by 준P



이름이 codeengn일때 시리얼 구하는 문제 입니다.



별다른 패킹은 없고요



문자열을 검색해봅시다.



분기점을 찾습니다.



살짝 올리니 분기점이 있네요



이름을 CodeEngn이라하고 비번은 대충입력합니다.



EAX와 SS가 있네여


EAX는 1E240이고 SS는 E4C60D97 입니다.


SS는


웬지 키 값일거 같네요





제가 입력한 값이네요



정답!!



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

codeengn) basic 17  (0) 2014.11.27
codeengn) basic 18  (0) 2014.11.27
codeengn) basic 15  (0) 2014.11.24
codeengn) basic 14  (0) 2014.11.24
codeengn) basic 13  (0) 2014.11.22
Posted by 준P



이름이 CodeEngn일떄 시리얼값을 구하는 문제 이네요



별다른 패킹은 되어있지 않습니다.



스트링을 찾으니 비교문다음에 나올 만한 문자가  있네요



분기점에 Bp를 걸어줌니다.


f9으로 실행!!!



대충 이름은 CodeEngn으로 하고 시리얼은 123456이러고 했습니다.



분기점의 DS와 EAX는


DS 6160

EAZ 1E240


입니다.


EAX는


제가 입력한 값이네요


DS는 




실제 키 값입니다.

인증!!


맞네요




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

codeengn) basic 18  (0) 2014.11.27
codeengn) basic 16  (0) 2014.11.24
codeengn) basic 14  (0) 2014.11.24
codeengn) basic 13  (0) 2014.11.22
codeengn) basic 12  (0) 2014.11.21
Posted by 준P



이름이 CodeEngn일때 시리얼 키를 구하는것 입니다.


꼭5자리 여야만 한담니다.



upx로 패킹되어 있고요



f8를 누른뒤에




덤프코드창에서 이동함니다.



하드웨어 브릭을 걸고


정확히 jmp문으로 가지네여



이제 덤프를 떠야합니다.



리빌드는 에러가 많으니 체크해제후



리빌드



오른쪽 클릭후 search for -> all intermodular calls로 메세지 박스를 잘 찾아서 검사문 까지 가야합니다.


여기서 분기점을 찾아서 비교합시다.


분기점에 bp를 걸어둠니다.



이름이 CodeEngn일떄 5자리 시리얼이라고 했으니 대충 입력 합시다.


분기점에서 


ESI= 129A1

EAX=3039


입니다.


EAX는



제가 입력한 값이고


ESI는 



실제 시리얼 값이네여






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

codeengn) basic 16  (0) 2014.11.24
codeengn) basic 15  (0) 2014.11.24
codeengn) basic 13  (0) 2014.11.22
codeengn) basic 12  (0) 2014.11.21
codeengn) basic 11  (0) 2014.11.21
Posted by 준P



이번 문제는 c#으로 제작되었네여



c#은 올리디 버거와 같은 디스 어셉블리어로 열리지 않습니다.


따라서 디컴파일러가 필요합니다.


dotPeek 라는 디컴파일러를 이용하였습니다.




이렇게 코드가 보임니다. 


이코드를 c# 컴파일러에 옭겨서  컴파일 하면 됨니다.


그런데 바로 되진 않져



코드가 더있아요 이걸 네임스페이스 안에 넣어주시면 됨니다.



그리고 반복문 앞에서 Console.WriteLine으로 str함수를 출력 해줌니다.


str함수에는 키 값이 있기 떄문 입니다.



실행하면 키 값이 보임니다.


Leteminman


이 키 값이 군요






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

codeengn) basic 15  (0) 2014.11.24
codeengn) basic 14  (0) 2014.11.24
codeengn) basic 12  (0) 2014.11.21
codeengn) basic 11  (0) 2014.11.21
codeengn) basic 10  (0) 2014.11.21
Posted by 준P



key값을 찾고 성공 메세지 대신에 키값을 출력하는데 그 주소범위중 앞 0000을 빼고 인증을 하면 되는 문제 입니다.

 


asm으로 제작되었네여



간단해 보임니다.


허나 이문제에는 함정이 있습니다.



저 위의 ascii 코드는 키값으로 보이지만 함정 입니다.


메세지 박스 위에 성공과 재 입력으로 가는 분기점이 있습니다.


7A2896BF는 16진수이며 10진수로 변경후 인증 해야 합니다.


10진수 값으로는 2049480383 입니다.



정답이네여


이제 헥스 에디터로 변경을 해야 합니다.



헥스 에디터에서 검색을하면 빠르게 값을 찾을수 있습니다.


다음과 같이 패치를 해줌니다.



문자열의 끝은 00 NULL입니다. 따라서 NULL값도 포함해서 범위를 계산해야 합니다.


따라서 범위는 0D3B~0D45입니다.


따라서 인증해야하는 값은


20494803830D3B0D45입니다.




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

codeengn) basic 14  (0) 2014.11.24
codeengn) basic 13  (0) 2014.11.22
codeengn) basic 11  (0) 2014.11.21
codeengn) basic 10  (0) 2014.11.21
codeengn) basic 07  (0) 2014.11.17
Posted by 준P



codeengn basic 11번 문제는 stolenbyte와 oep를 구하는 문제입니다. 또?


upx로 패킹되어 있고요?










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

codeengn) basic 13  (0) 2014.11.22
codeengn) basic 12  (0) 2014.11.21
codeengn) basic 10  (0) 2014.11.21
codeengn) basic 07  (0) 2014.11.17
codeengn) basic 03  (0) 2014.11.17
Posted by 준P



codeengn10번문제는 oep를 구하고 분기점의 opcode를 구하는 문제 입니다.



codeengn basic 10번 문제는 ASPack으로 패킹되어 있습니다.



ASPack은 retn 0c값을 찾은 뒤에 밑에 있는 retn 으로 가면 OEP가 나옴니다.



ctrl + f 로 retn 0c를 찾아 줌니다.



 bp를 걸어주시고요



f9후 retn값을 지나면!!!


다음과 같이 나옴니다.



여기서 오른쪽클릭후 analyze this 를 해서 정리 해줌니다.



정리를 하면 다음과 같이 됨니다.



이제 덤프를 해줌니다.



덤프를 할때는 리빌드를 해제해 주시고 덤프를 함니다.




lord pe툴로 리빌드를 해줌니다.



정상적으로 언팩이 되었습니다.


이제 문자열을 검색하여 분기점을 찾도록 하겟습니다.




JNZ는 ZF가 0이 아닐때 점프 합니다.


일종의 분기점이져



따라서 분기점의 opcode는 7555입니다.


oep와 분기점의 opcode를 합치면


004458347555입니다.




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

codeengn) basic 12  (0) 2014.11.21
codeengn) basic 11  (0) 2014.11.21
codeengn) basic 07  (0) 2014.11.17
codeengn) basic 03  (0) 2014.11.17
codeengn) bisic 05  (0) 2014.11.16
Posted by 준P



c드라이브가 CodeEngn일때 시리얼이 어떻게 변경되는지 알아보는 문제 이굼뇨


올리디버거로 열어보았습니다.



천천히 실행 시킨 다음 시리얼을 입력하는 창이 나왔습니다.



저는 crasy라고 대충 입력했습니다.


역시 틀렷다고 나오는 군요



그런데 덤프코드를 보니 이렇게 입력되어 있군요


시리얼키로 의심이 됨니다.


메모장에 복사를 하고




인증해보앗습니다.


맜았습니다.


L2C-5781EqfgEngn4562-ABEX가 시리얼 키 입니다.


하지만 이게 답은 아님니다.


문자열을 검색해보면


4562-ABEX와 L2C-5781이 있는것을 확인할수 있습니다.



따라서 정답은 


EqfgEngn입니다.



인증 ㅎㅎ


맛았습니다.


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

codeengn) basic 11  (0) 2014.11.21
codeengn) basic 10  (0) 2014.11.21
codeengn) basic 03  (0) 2014.11.17
codeengn) bisic 05  (0) 2014.11.16
codeengn) basic 09  (0) 2014.11.16
Posted by 준P



스트링 비교 함수를 찾는 문제 입니다.


저는 pe view로 열어서 함수 내용을 보도록 하겟습니다.


보니 __vbaStrCmp라고 문자열 비교 함수로 보이는 함수가 있습니다.



 

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

codeengn) basic 10  (0) 2014.11.21
codeengn) basic 07  (0) 2014.11.17
codeengn) bisic 05  (0) 2014.11.16
codeengn) basic 09  (0) 2014.11.16
codeengn) basic 06  (0) 2014.11.16
Posted by 준P



프로그램의 등록키를 알아내는 


upx로 패킹되어 있고요



f8으로 한칸 내려감니다.



덤프부분에서 ctrl+g로 주소부분을 이동함니다.



하드웨어브릭을 걸어주시고요



f9으로 실행하면   jmp부분에서 멈춤니다.


f8으로 oep부분으로 감니다.



이제 덤프를 합시다.



리빌드는 자주에러가 난다고 함니다.



lord pe로 리빌드를 해줌니다.



완료




borkand Delphih로 제작되엇습니다.



레지스터키가 

인증



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

codeengn) basic 07  (0) 2014.11.17
codeengn) basic 03  (0) 2014.11.17
codeengn) basic 09  (0) 2014.11.16
codeengn) basic 06  (0) 2014.11.16
codeengn) basic 8  (0) 2014.10.20
Posted by 준P


코드엔진 베이직 09번 문제 입니다.


stolenByte를 구하라고 하는데요


stolenByte란



upx로 패킹 되어 있습니다





f8으로 한칸 내려주시고요



이제 덤프 부분에서 ctrl+g로 이동해줌니다.



이제 하드웨어 브릭을 걸어주신뒤


f9으로 실행을 하시면 됨니다.




그런데 StolenByte는 프로그램이 실행되기 위해 필요한 바이트를 jmp이전에 넘겨서 이것을 무시하고 덤프를 하면 프로그램이 오류가 남니다.


제가 동그라미 한부분을 메모해둠니다.




jmp를 지난 뒤에 살짝위로 스크롤하면 nop부분이 있습니다.


이부분을 어셈블리해서 메모했던 부분으로 채워 줌니다.



이제 덤프를 하면 정상적으로 실행이 됨니다.


그리고 StolenByte는




이것입니다.


인증시에 6A0068002040006812204000을 인증하시면 됨니다.





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

codeengn) basic 03  (0) 2014.11.17
codeengn) bisic 05  (0) 2014.11.16
codeengn) basic 06  (0) 2014.11.16
codeengn) basic 8  (0) 2014.10.20
codeengn) basic 4  (0) 2014.10.17
Posted by 준P