728x90

Challenges : Basic 12


Author : Basse 2002


Korean : 
Key를 구한 후 입력하게 되면 성공메시지를 볼 수 있다 
이때 성공메시지 대신 Key 값이 MessageBox에 출력 되도록 하려면 파일을 HexEdit로 오픈 한 다음 
0x???? ~ 0x???? 영역에 Key 값을 overwrite 하면 된다. 

문제 : Key값과 + 주소영역을 찾으시오 
Ex) 7777777???????? 


English : 
You will see a success message after finding the key. 
If you would want the Key itself to replace the success message in the MessageBox, 
open up a Hex Editor and overwrite the key value in the offset range 0x???? ~ 0x????. 

Q : find the key value and the offset range and write the solution in this format : key???????? 
(first ???? for the start and the next 4 ?s for the end). 

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


심플 합니다. 심플한 키젠입니다. PEiD로 확인해 보시면 알겠지만

패킹도 안되어 있습니다. 사정없이 디버거로 벗겨(?) 봅시다.




이것 저것 breakpoint를 걸어보며 살펴보았지만 제가 적은 문자열은 어디에서도 찾아볼 

수 없었습니다. 그래서 함수기능을 찾아보던중 위 화면에 "GetDlgItemInt"라는 함수가

텍스트를 정수형으로 변환하는 함수라는 것을 알게되었습니다. 그래서 저 함수에 break를

걸고 실행해 보았습니다.


입력후 Check 버튼을 누르면


함수 호출후...


반환값이 저장되는 EAX의 레지스터 값이 200

즉 10진수로 512가 저장되는 것을 확인했습니다.


그리고 밑에보니 올바른 키값일 경우의 메시지박스로 가는 분기점을 찾았고

저 분기점에서의 EAX레지스터 값을 확인해보니


그대로 였습니다. 결국 키값은 분기점에서 EAX와 비교하는 저 값인 것을 알게되었습니다.

저 값을 10진수로 변환하면 되겠죠?


그리고 문제대로 성공메시지박스의 내용을 수정합시다. (원래는 키값으로 수정)


끝!

728x90
728x90

Challenges : Basic 10


Author : ArturDents


Korean 
OEP를 구한 후 "등록성공"으로 가는 분기점의 OPCODE를 구하시오. 정답인증은 OEP + OPCODE 
EX) 00400000EB03 

English 
After finding the OEP, find the OPCODE of the branch instruction going to the "goodboy routine" 
The solution should be in this format : OEP + Serial 
EX) 00400000EB03 

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

실행해 보니 PUSHAD로 시작합니다. PEiD로 확인을 해보면



역시나 패킹이 되어있지만 이번에는 UPX가 아닌 ASPack이란 방식으로 되어있네요.

패킹 방법을 찾아보니 UPX와 크게 다르지 않습니다.



그림과 같이 1줄 진행하여 레지스터들을 스택에 넣은후

ESP에 커서를 놓고 오른쪽버튼 - Follow in Dump 를 눌러 덤프를 뜹니다.



그리고 덤프에서(왼쪽 아래창) break point 를 걸어줍니다.

이렇게 하는 이유는 PUSHAD를 했으면 언젠가 POPAD를 할 텐데

그 지점을 찾기가 힘드니까 이런식으로 break point를 거는 것 입니다.


그리고 진행을 하면 


원하는 곳으로 오게 되었습니다. 진행하여 OEP로 갑시다.



뭔가 휑 하고 이상하지만 참고 덤프를 뜨고 LordPE로 rebuild를 해줍시다.



Unpacking이 잘 되었습니다. 옵코드를 보니 덤프뜨기전 OEP의 값들과 같습니다.


all referenced text strings을 보니 Registered well done! 이라는 부분이 있습니다.

더블클릭 해서 위에 있는 분기점의 옵코드를 확인합시다. 그럼 끝!

728x90
728x90


Challenges : Basic 08


Author : Rekenmachine


Korean 
OEP를 구하시오 
Ex) 00400000 

English 
Find the OEP 
Ex) 00400000 


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

PEiD로 확인해 보면 친절히 UPX라고 알려줍니다. UPX는 이미 해봤으므로


자세한 내용은 생략합니다.

728x90
728x90


Challenges : Basic 07


Author : abex

Korean 
컴퓨터 C 드라이브의 이름이 CodeEngn 일경우 시리얼이 생성될때 CodeEngn은 "어떤것"으로 변경되는가 

English 

Assuming the drive name of C is CodeEngn, what does CodeEngn transform into in the process of the serial construction 

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

실행해 보니 역시나 올바른 키값을 요구합니다.

주저없이 디버거로 열어 봅시다.


코드는 생각보다 짧습니다.

문제를 보면 c드라이브의 이름을 구해서 변경하는 부분이 있을 것 같습니다.

먼저 구하는 곳을 찾아보면


이부분의 이 함수가 왠지 수상합니다. 함수를 검색해보니

드라이브 정보들의 주소를 함수의 인자들에게 리턴해 줍니다. 그중 드라이브 이름은



여기에 리턴 됩니다. 0040225C


그러나 애석하게도 드라이브에 이름따윈 지정하지 않았습니다.

그 다음 lstrcatA 함수로 드라이브이름이 저장된 문자열 다음에 요상한 시리얼 문자열을 붙입니다.


그다음 DL에 2를 넣어 루프로 40225C의 문자열의 앞 4바이트를 2씩 더합니다.

(+1씩 2번)




00402000 영역에 L2C....를 붙이고 0040225C를 붙여 제가 입력한 123456값과 비교하여


맞으면 맞았다고 틀리면 틀렸다고 메시지박스를 띄웁니다.


물론 답은 CodeEngn문자열이 변한 값이니 쉽게 유추할 수 있습니다.

728x90
728x90



Challenges : Basic 06


Author : Raz0r

Korean 
Unpack을 한 후 Serial을 찾으시오. 정답인증은 OEP + Serial 
Ex) 00400000PASSWORD 

English 
Unpack, and find the serial. The solution should be in this format : OEP + Serial 

Ex) 00400000PASSWORD 


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


언패킹은 저번 basic 5번 포스팅에서 자세히 다루었으니 똑같이 하시면 됩니다.

(같은 UPX 방식 입니다.)


그럼 OEP는 구하실 수 있을 겁니다. 시리얼은 역시나 search for로 가 봅시다.




근데 막상 별 내용이 없습니다. 아마도 프로그램 중간에 생성되지 않을까 생각 합니다.


그래서 우리는 한 꼼수를 쓰려 합니다. (꼼수라기 보다는 기능이죠 ㅎ)


다행히 디버거에서는 우리가 원하는 타이밍에 멈추어 해당 지점으로 갈수있게 지원을 합니다.


우선 F9로 진행하여 입력란을 띄웁니다.




그리고 아무 입력을 하고 Check Serial을 입력합니다. 그리고 suspend 버튼을 누릅니다.



(요 버튼)


그러면 프로그램이 멈출 것입니다. 그 상태에서 Alt + F9 를 누릅니다.




그럼 이렇게 오른쪽 아래가 Back to user라고 바뀔 것입니다. 그 상태에서 확인버튼을 눌러


이벤트를 발생시키면 해당 바이너리 코드로 EIP 가 이동 하게 된다.


즉 현재 EIP는 에러창메시지박스 호출 다음일 것이다. 실제로 위로 올리면 그 사실을


할 수 있다. 




그리고 그 좀더 위에 우리가 입력한 값과 원하는 부분을 찾을 수 있다.

728x90
728x90


Challenges : Basic 05


Author : Acid Bytes [CFF]

Korean 
이 프로그램의 등록키는 무엇인가 

English 

The registration key of this program is? 

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

-준비물 : OllyDbg , OllyDump(플러그인입니다.), PEiD, LordPE




실행시켜 보면 별거 없고


등록키 입력란에 올바른 값만 넣어주면 될것 같습니다. 디버거로 열어봅시다.


그럼 이상한 메시지가 팝업이 되고 확인을 누르면 이런창이 뜰 것입니다.



첫줄에 보면 PUSHAD라는 명령이 있는데 찾아보니 범용 레지스터의 데이터값을


스택에 저장한다네요. 한마디로 백업!


(참고로 순서는 EAX->ECX->EDX->EBX->ESP->EBP->ESI->EDI 입니다.)


근데 왜 프로그램의 처음부터 레지스터값을 백업을 할까... 아까의 창도 거슬리고..


패킹이 되어있나 확인해 봅시다.


PEiD툴로 위 파일을 열어보면




 upx알고리즘으로 패킹이 되어있는 것을 확인하실 수 있습니다.


자 그럼 패킹을 풀어 봅시다. 다시 디버거로 넘어가서


PUSHAD 가 있으면 POPAD즉 다시 스택에서 레지스터로 값을 불러오는 작업도


있겠지요?? 실제로 upx방식은 POPAD후 JMP문으로 OEP(original entry point)로


갈수 있게 되어있습니다. 그럼 디버거에서 한참 ~~ 한참 밑으로 가 보시면


이렇게 POPAD와 JMP문이 나오게 될 겁니다.




그럼 JMP문에 break point 를 걸고 f9로 break point 까지 실행을 해서 OEP로 넘어가 봅시다.




저 아스키값만 보아도 제대로 온 것 같죠? 이제 Plugins - OllyDump를 이용해 덤프를 뜹니다.




이떄 Rebuild Import 는 체크해제후(체크하면 LordPE툴을 안써도 Rebuid가 됩니다.)  덤프를 뜹니다.


그리고 LordPE를 열어서 Rebuild PE를 하여 IAT(Import Address Table)을 재설정합니다.




여기서 잠깐!  IAT란? PE구조에서 실행파일이 어떤 라이브러리(DLL)의 어떤 함수를

                   사용하는지에 대한 테이블이라 생각하시면 됩니다. DLL의 로딩방식의 경우

                   프로그램에 사용되는 순간 로딩과 프로그램이 시작될때 로딩 이 있는데 전자의

                   경우 Explicit Linking방법으로 EAT에 기술이 되어있고 후자의 경우

                   Implicit Linking방법으로 IAT에 기술이 되어 있다고 합니다.




저 버튼으로 PE구조를 Rebuild 해줄 수 있습니다. 그리고 다시 PEiD로 확인하면




언패킹 된 것을 확인할 수 있습니다.



나머지는 OllyDbg를 열어 search for로 모든 text보기를 하시면 답을 아실 수 있을 겁니다.

728x90
728x90



Challenges : Basic 04


Author : CodeEngn

Korean 
이 프로그램은 디버거 프로그램을 탐지하는 기능을 갖고 있다. 디버거를 탐지하는 함수의 이름은 무엇인가 

English 

This program can detect debuggers. Find out the name of the debugger detecting function the program uses. 


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


실행해 봅시다.




디버거 없이 실행을 하니 정상이라고 출력이 되네요. 이제 디버거로 실행 해 봅시다.




어이쿠; 디버깅 당함이라고 문자열을 출력하네요.


출력문에따라 열심히 디버거로 follow 하게 되면 요 부분이 나올 겁니다. (아마 main함수)




어! 이름부터 냄새가 엄청 나는 함수하나가 눈에 띌 겁니다.

728x90
728x90


Challenges : Basic 03


Author : Blaster99 [DCD]


Korean 
비주얼베이직에서 스트링 비교함수 이름은? 

English 
What is the name of the Visual Basic function that compares two strings? 


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


실행해보면 이상한 메시지박스가 뜨고 확인을 누르면


요런 화면이 뜨네요.

아무거나 입력 합시다.



영어가 아니라 뭔가 이상하지만

패스워드가 맞지 않는다고 하는 군요.


올리디버그로 열어서 우클릭


요거 클릭


쭉쭉 내려보면


요 수상해보이는 문자열 더블클릭!


break를 걸고 break point까지 실행을 시켜 적당한 값을 넣읍시다.

(F2는 break걸기 F9는 break포인트까지 실행)




밑줄친 부분을 보면 내가 입력한 값과 이상한 문자열을 비교하는 것을 볼 수 있습니다.

그리고 그 밑에 찾던 비주얼베이직 비교함수의 명이 나와 있습니다.

728x90
728x90


Challenges : Basic 02


 

Author : ArturDents


 

Korean :
패스워드로 인증하는 실행파일이 손상되어 실행이 안되는 문제가 생겼다. 패스워드가 무엇인지 분석하시오

English :
The program that verifies the password got messed up and ceases to execute. Find out what the password is.


--------------------------------------------------------------------------------.


실행시켜 보시면 파일이 깨져 실행할수 없다고 뜰 것입니다.


해서 올리디버그로도 열리지 않을 겁니다.


그럼 최후의 수단은????????


네. 헥사편집기로 열어 보죠.


그럼 무수히 많은(내려보면 양은 생각보다 적지만)


바이너리값이 펼쳐집니다.


내리다보면 이런 부분이 있을 겁니다.




요런 부분을 발견 할 수 있습니다.


사실 이렇게는 잘못된 접근법이고




정적혹은 전역 변수들은 PE구조에서 data섹션(읽기,쓰기 가능)에 저장이 됩니다. 그리고


data섹션에도 여러가지가 있는데 그중 .rdata섹션은 읽기전용 섹션으로


상수값이 저장이 되는 영역입니다. 헥사편집기에서 PE구조체에 따라




요 부분이 .rdata의 헤더 부분이고 저 부분의


17~20번째 4바이트는 "파일"에서 .rdata영역의 크기이고            ) 화면에서 00 02 00 00

21~24번째 4바이트는 "파일"에서 .rdata영역의 시작주소이다.     ) 화면에서 00 06 00 00


저 값들은 "리틀 엔디언" 값이므로 크기는 200h 이고 시작주소는 600h 입니다.




최종적으로 비밀번호가 지역변수나 알고리즘에 의한 리턴값이 아닌이상


data섹션에 존재할 것이고 따라서 처음에 야매(?)로 발견한 비밀번호값이


600h~800h 사이에 있으므로 비밀번호는 상수(#define, const 등)으로 존재하는걸 알 수 있습니다.

(원래는 이런 접근을 하라고 만든 문제 인 것 같네요.)

728x90
728x90


앞으로 코드엔진의 리버싱 문제를 짬짬히 올려보려 합니다!!

(언제까지 열정을 가지고 할지는 모르지만...)



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

Challenges : Basic 01


 

Author : abex


 

Korean :
HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가

English :
What value must GetDriveTypeA return in order to make the computer recognize the HDD as a CD-Rom


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


위 실행파일을 실행시키면




hd를 cd-rom으로 인식하게 하라고 뜨네요

그리고 확인을 누르면


CD-ROM이 아니라고 에러창을 표시합니다. 자 이제 이것을 올리디버그로 열어보면



이런 화면이 뜨게 될 것입니다. 그리고 401018번지에서 GetDriveTypeA함수를

호출하는 것을 보실 수 있습니다.


http://msdn.microsoft.com/ko-kr/library/windows/desktop/aa364939(v=vs.85).aspx


위 msdn문서를 참고하시면 GetDriveType 함수의 반환값은 3이 될 것입니다. (HDD이므로)

실제로 F8을 눌러 실행을 진행시키시면 



위 같이 EAX 레지스터 값이 3일 될 것입니다. (함수의 반환값은 EAX에 저장이 됩니다.)


이떄 레지스터를 두번 클릭하면 레지스터값을 변경할 수 있습니다.



우리는 cd로 인식하게 할거니까 5의 값을 입력하면 (msdn문서 참조) 되겠죠?


수정하고 진행하시면 안되는 분들이 계실 겁니다.


그 이유는 컴퓨터마다 ESI레지스터 초기 값이 다른데


저같은 경우에도



ESI 초기값이 -1 이어서



이렇게 비교문에서 다른 값이 되기 때문에


에러메시지가 나올수 밖에 없는 것입니다.


해서 EAX값은 4로 수정하시면 정상 출력이 될 것입니다.


그러나 레지스터값을 수정하는 방법은 일시적이므로




다른 방법으로는 어셈블리 내용을 수정하는 방법이 있습니다.




이렇게 INC ESI를 NOP(아무것도 하지않음)으로 수정하여


GetDriveType함수의 반환값이 3이어도 올바른 메시지를 출력하게끔 수정하였습니다.


 진행하시면 원하는 메시지를 출력하게 될 것입니다.


(수정후 우클릭 Copy to executable - All modifications 클릭후

나온창에서 다시 우클릭 Save file 하시면 수정된 내용을 저장도 하실 수 있습니다.)



JMP문을 수정하는 방법도 있지만 실행때마다 메모리 번지가 달라질수 있어서


좋은 방법은 아니라고 합니다.

728x90

+ Recent posts