CrackMe4 실행
문자열을 입력하지 않고 실행시 Bitx,\m[][]{c~h,6,_oma|i~ 문자열이 표시된다.


사용자로부터 입력받은 문자열을 처리하는 부분

동적할당 부분


ebp = stack frame pointer(sfp)
 
stack frame pointer omission
ebx : 첫 번째 동적할당 : 008f0630
ebp : 두 번째 동적할당 : 008f0660
 
스택프레임이 생략
장점
-속도가 빨라진다
-레지스터를 하나 더 사용할 수 있다.
-파일의 사이즈도 작아진다.
단점
-컴파일이 오래걸린다.
 이유 : esp로만 데이터의 위치를 찾아야하기 때문
 
아래는 data영역에서 ctrl+g 로 문자열을 찾은 주소
00405068 : Bitx,\m[][]{c~h,6,_oma|i~


REPNE SCAS BYTE PTR ES:[EDI]
//SCAS=SCANSTRING , NULL문자를 찾음
 
NOT ECX
//음수를 비트 반전을시켜 문자열의 갯수를 구함
 
SUB EDI,ECX
//증가가되어 있는 EDI를 원래상태로 복구
 
SHR ECX,2
//ECX/4 하는 이유는 전체길이를 4BYTE씩 나누어 복사하려면 몇번을 해야하는지를 구함
 
REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
//문자열의 복사



MOV ECX,DWORD PTR SS:[ESP+14]
//사용자가 입력한 문자열의 주소를 ecx에 넣음
 
MOV AL,BYTE PTR DS:[ECX]
//ecx에 있는 첫글자를 al에 넣음
 
ADD DL,AL//첫글자를 DL에 넣음
 
MOV AL,BYTE PTR DS:[ECX+1]
//다음문자를 al에 넣음
 
INC ECX
//ecx를 증가시켜 3번째 문자를 가르킴
 
TEST AL,AL
//다음문자도 null값인지 비교
 
JNZ SHORT 004012B7
//null이 아니면 4012B7로 점프
 
MOV CL,BYTE PTR DS:[EBX]
//CL = B
 
MOV ESI,EBP
//ESI에 두번째 동적할당 받은 주소를 넣어줌
 
MOV EAX,EBX
//첫번째 동적할당 받은 주소를 EAX에 넣음
 
SUB ESI,EBX
//ESI = 두번째 동적할당 - 첫번째 동적할당 받은 주소
 
MOV BYTE PTR DS:[ESI+EAX],CL
//두번째 동적할당 받은 공간의 BYTE = CL
 
MOV CL,BYTE PTR DS:[EAX+1]
//두 번째 문자열을 CL에 넣음
 
위의 내용을 토대로 DL ^ Bitx, ~~~~~ 가 됨
     

8비트 암호화 알고리즘 확인

C코드로 DL의 8비트를 1씩 증가시키며 알고리즘 구현




j 가 12일 때 패스워드가 뜬다.
 
j가 12라는 것은 아스키코드 10진수 12를 의미하며
12는 16진수로 0c가된다.
문자열을 조합해 마지막 1byte가 0c 가 되면 되므로
ddD를 입력하면 10C가 되고 마지막 1byte가 0c가 된다.
 
 



위와 같이 Next Password : Scamper라는 문자열이 출력된다.


+ Recent posts