며칠전에 어떤 프로그램에 걸린 패스워드를 우회할수 있는지 문의가 왔었다.
프로그램은 패킹되어 있는것으로 보였고, 암호를 입력해야만 작동하는 방식이었다.
일단 우리 고객님은 비밀번호를 모르신다.
암호화는 SHA-1 으로 되어 있었다. 아래는 SHA-1 암호화 알고리즘의 어셈코드 모습. 역시 복잡하다. 웃긴게 난 이게 SHA-1 인줄도 몰랐다. 머리를 쥐어뜯다. 20바이트 해쉬크기를 가지는 암호화가 뭐가 있나 찾아봤더니 SHA-1 이었다. 전수대입으로 풀어도 무지막지하게 오래 걸리는… -_- 하마터면 나 큰도전 할뻔했다.
CPU Disasm
Address Hex dump Command Comments
012386B3 55 PUSH EBP
012386B4 8BEC MOV EBP,ESP
012386B6 81EC 54010000 SUB ESP,154
012386BC 53 PUSH EBX
012386BD 56 PUSH ESI
012386BE 57 PUSH EDI
012386BF 8DB5 ACFEFFFF LEA ESI,[EBP-154]
012386C5 8D51 1C LEA EDX,[ECX+1C]
012386C8 C745 FC 1000000 MOV DWORD PTR SS:[EBP-4],10
012386CF 8B02 MOV EAX,DWORD PTR DS:[EDX]
012386D1 83C2 04 ADD EDX,4
012386D4 8BF8 MOV EDI,EAX
012386D6 8BD8 MOV EBX,EAX
012386D8 81E7 0000FF00 AND EDI,00FF0000
012386DE C1EB 10 SHR EBX,10
012386E1 0BFB OR EDI,EBX
012386E3 8BD8 MOV EBX,EAX
012386E5 C1E3 10 SHL EBX,10
012386E8 25 00FF0000 AND EAX,0000FF00
012386ED 0BD8 OR EBX,EAX
012386EF C1EF 08 SHR EDI,8
012386F2 C1E3 08 SHL EBX,8
012386F5 0BFB OR EDI,EBX
012386F7 893E MOV DWORD PTR DS:[ESI],EDI
012386F9 83C6 04 ADD ESI,4
012386FC FF4D FC DEC DWORD PTR SS:[EBP-4]
012386FF ^ 75 CE JNE SHORT 012386CF
01238701 6A 40 PUSH 40
01238703 8D95 B4FEFFFF LEA EDX,[EBP-14C]
01238709 5E POP ESI
0123870A 8B42 2C MOV EAX,DWORD PTR DS:[EDX+2C]
0123870D 3342 18 XOR EAX,DWORD PTR DS:[EDX+18]
01238710 3342 F8 XOR EAX,DWORD PTR DS:[EDX-8]
01238713 3302 XOR EAX,DWORD PTR DS:[EDX]
01238715 83C2 04 ADD EDX,4
01238718 8BF8 MOV EDI,EAX
0123871A 03C0 ADD EAX,EAX
0123871C C1EF 1F SHR EDI,1F
0123871F 0BF8 OR EDI,EAX
01238721 4E DEC ESI
01238722 897A 34 MOV DWORD PTR DS:[EDX+34],EDI
01238725 ^ 75 E3 JNE SHORT 0123870A
01238727 8B71 10 MOV ESI,DWORD PTR DS:[ECX+10]
0123872A 8B79 14 MOV EDI,DWORD PTR DS:[ECX+14]
0123872D 8B41 08 MOV EAX,DWORD PTR DS:[ECX+8]
01238730 8B51 0C MOV EDX,DWORD PTR DS:[ECX+0C]
01238733 8D9D ACFEFFFF LEA EBX,[EBP-154]
01238739 8975 F8 MOV DWORD PTR SS:[EBP-8],ESI
0123873C 8B71 18 MOV ESI,DWORD PTR DS:[ECX+18]
0123873F 897D EC MOV DWORD PTR SS:[EBP-14],EDI
01238742 895D FC MOV DWORD PTR SS:[EBP-4],EBX
01238745 C745 F4 1400000 MOV DWORD PTR SS:[EBP-0C],14
0123874C 8BDA MOV EBX,EDX
0123874E 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
01238751 F7D3 NOT EBX
01238753 23DF AND EBX,EDI
01238755 8B7D F8 MOV EDI,DWORD PTR SS:[EBP-8]
01238758 23FA AND EDI,EDX
0123875A 33DF XOR EBX,EDI
0123875C 8BF8 MOV EDI,EAX
0123875E C1EF 1B SHR EDI,1B
01238761 C1E0 05 SHL EAX,5
01238764 0BF8 OR EDI,EAX
01238766 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
01238769 8345 FC 04 ADD DWORD PTR SS:[EBP-4],4
0123876D 03F3 ADD ESI,EBX
0123876F 8B00 MOV EAX,DWORD PTR DS:[EAX]
01238771 03FE ADD EDI,ESI
01238773 8B75 EC MOV ESI,DWORD PTR SS:[EBP-14]
01238776 8BDA MOV EBX,EDX
01238778 C1E3 1E SHL EBX,1E
0123877B C1EA 02 SHR EDX,2
0123877E 8D8407 9979825A LEA EAX,[EAX+EDI+5A827999]
01238785 8B7D F8 MOV EDI,DWORD PTR SS:[EBP-8]
01238788 0BDA OR EBX,EDX
0123878A FF4D F4 DEC DWORD PTR SS:[EBP-0C]
0123878D 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
01238790 897D EC MOV DWORD PTR SS:[EBP-14],EDI
01238793 895D F8 MOV DWORD PTR SS:[EBP-8],EBX
01238796 ^ 75 B4 JNE SHORT 0123874C
01238798 8D9D FCFEFFFF LEA EBX,[EBP-104]
0123879E C745 F4 1400000 MOV DWORD PTR SS:[EBP-0C],14
012387A5 895D FC MOV DWORD PTR SS:[EBP-4],EBX
012387A8 8BD8 MOV EBX,EAX
012387AA 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
012387AD C1EB 1B SHR EBX,1B
012387B0 C1E0 05 SHL EAX,5
012387B3 0BD8 OR EBX,EAX
012387B5 8BC7 MOV EAX,EDI
012387B7 8B7D F8 MOV EDI,DWORD PTR SS:[EBP-8]
012387BA 33C7 XOR EAX,EDI
012387BC 33C2 XOR EAX,EDX
012387BE 03D8 ADD EBX,EAX
012387C0 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
012387C3 8345 FC 04 ADD DWORD PTR SS:[EBP-4],4
012387C7 0318 ADD EBX,DWORD PTR DS:[EAX]
012387C9 8D8433 A1EBD96E LEA EAX,[ESI+EBX+6ED9EBA1]
012387D0 8B75 EC MOV ESI,DWORD PTR SS:[EBP-14]
012387D3 8BDA MOV EBX,EDX
012387D5 897D EC MOV DWORD PTR SS:[EBP-14],EDI
012387D8 C1E3 1E SHL EBX,1E
012387DB C1EA 02 SHR EDX,2
012387DE 0BDA OR EBX,EDX
012387E0 FF4D F4 DEC DWORD PTR SS:[EBP-0C]
012387E3 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
012387E6 895D F8 MOV DWORD PTR SS:[EBP-8],EBX
012387E9 ^ 75 BD JNE SHORT 012387A8
012387EB 8D9D 4CFFFFFF LEA EBX,[EBP-0B4]
012387F1 C745 F4 1400000 MOV DWORD PTR SS:[EBP-0C],14
012387F8 895D FC MOV DWORD PTR SS:[EBP-4],EBX
012387FB 8B5D F8 MOV EBX,DWORD PTR SS:[EBP-8]
012387FE 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
01238801 33DA XOR EBX,EDX
01238803 23DF AND EBX,EDI
01238805 8B7D F8 MOV EDI,DWORD PTR SS:[EBP-8]
01238808 23FA AND EDI,EDX
0123880A 33DF XOR EBX,EDI
0123880C 8BF8 MOV EDI,EAX
0123880E C1EF 1B SHR EDI,1B
01238811 C1E0 05 SHL EAX,5
01238814 0BF8 OR EDI,EAX
01238816 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
01238819 03DF ADD EBX,EDI
0123881B 8B7D F8 MOV EDI,DWORD PTR SS:[EBP-8]
0123881E 0318 ADD EBX,DWORD PTR DS:[EAX]
01238820 8345 FC 04 ADD DWORD PTR SS:[EBP-4],4
01238824 8D8433 DCBC1B8F LEA EAX,[ESI+EBX+8F1BBCDC]
0123882B 8B75 EC MOV ESI,DWORD PTR SS:[EBP-14]
0123882E 8BDA MOV EBX,EDX
01238830 897D EC MOV DWORD PTR SS:[EBP-14],EDI
01238833 C1E3 1E SHL EBX,1E
01238836 C1EA 02 SHR EDX,2
01238839 0BDA OR EBX,EDX
0123883B FF4D F4 DEC DWORD PTR SS:[EBP-0C]
0123883E 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
01238841 895D F8 MOV DWORD PTR SS:[EBP-8],EBX
01238844 ^ 75 B5 JNE SHORT 012387FB
01238846 8D5D 9C LEA EBX,[EBP-64]
01238849 C745 F4 1400000 MOV DWORD PTR SS:[EBP-0C],14
01238850 895D FC MOV DWORD PTR SS:[EBP-4],EBX
01238853 8BD8 MOV EBX,EAX
01238855 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
01238858 C1EB 1B SHR EBX,1B
0123885B C1E0 05 SHL EAX,5
0123885E 0BD8 OR EBX,EAX
01238860 8BC7 MOV EAX,EDI
01238862 8B7D F8 MOV EDI,DWORD PTR SS:[EBP-8]
01238865 33C7 XOR EAX,EDI
01238867 33C2 XOR EAX,EDX
01238869 03D8 ADD EBX,EAX
0123886B 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0123886E 8345 FC 04 ADD DWORD PTR SS:[EBP-4],4
01238872 0318 ADD EBX,DWORD PTR DS:[EAX]
01238874 8D8433 D6C162CA LEA EAX,[ESI+EBX+CA62C1D6]
0123887B 8B75 EC MOV ESI,DWORD PTR SS:[EBP-14]
0123887E 8BDA MOV EBX,EDX
01238880 897D EC MOV DWORD PTR SS:[EBP-14],EDI
01238883 C1E3 1E SHL EBX,1E
01238886 C1EA 02 SHR EDX,2
01238889 0BDA OR EBX,EDX
0123888B FF4D F4 DEC DWORD PTR SS:[EBP-0C]
0123888E 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
01238891 895D F8 MOV DWORD PTR SS:[EBP-8],EBX
01238894 ^ 75 BD JNE SHORT 01238853
01238896 8B51 08 MOV EDX,DWORD PTR DS:[ECX+8]
01238899 03D0 ADD EDX,EAX
0123889B 8B41 0C MOV EAX,DWORD PTR DS:[ECX+0C]
0123889E 8951 08 MOV DWORD PTR DS:[ECX+8],EDX
012388A1 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
012388A4 03C2 ADD EAX,EDX
012388A6 8BD3 MOV EDX,EBX
012388A8 8941 0C MOV DWORD PTR DS:[ECX+0C],EAX
012388AB 8B41 10 MOV EAX,DWORD PTR DS:[ECX+10]
012388AE 03C2 ADD EAX,EDX
012388B0 8941 10 MOV DWORD PTR DS:[ECX+10],EAX
012388B3 8B41 14 MOV EAX,DWORD PTR DS:[ECX+14]
012388B6 03C7 ADD EAX,EDI
012388B8 5F POP EDI
012388B9 8941 14 MOV DWORD PTR DS:[ECX+14],EAX
012388BC 8B41 18 MOV EAX,DWORD PTR DS:[ECX+18]
012388BF 03C6 ADD EAX,ESI
012388C1 5E POP ESI
012388C2 8941 18 MOV DWORD PTR DS:[ECX+18],EAX
012388C5 5B POP EBX
012388C6 C9 LEAVE
012388C7 C3 RETN
단순히 암호 입력만 우회하면 될줄 알았는데, 암호 우회만으로는 프로그램이 메모리참조 오류를 뱉으며 죽어버렸다.
자세히 보니 입력된 암호를 토대로 복호화를 하고 있었다. 복호화 대상은 어딘가의 메모리 주소이다. 복호화된 주소를 참조하다 오류가 났기 때문이다.
일단 암호화 하는 부분의 어셈코드이다.
CPU Disasm
Address Hex dump Command Comments
0117855B 55 PUSH EBP
0117855C 8BEC MOV EBP,ESP
0117855E 81EC 08020000 SUB ESP,208 ; 지역변수 할당 공간 확보
01178564 57 PUSH EDI
01178565 EB 01 JMP SHORT 01178568
01178567 90 NOP
01178568 EB 01 JMP SHORT 0117856B
0117856A 90 NOP
0117856B 33FF XOR EDI,EDI
0117856D 397D 14 CMP DWORD PTR SS:[EBP+14],EDI ; 패스워드 길이 체크 0인지 아닌지.
01178570 75 07 JNE SHORT 01178579 ; 0이 아니면 점프..
01178572 33C0 XOR EAX,EAX ; EAX 를 NULL 로 만들고
01178574 E9 2A010000 JMP 011786A3 ; 0 이면 함수를 빠져나감..
01178579 53 PUSH EBX ; 그래 요기..
0117857A 56 PUSH ESI
0117857B EB 01 JMP SHORT 0117857E
0117857D 90 NOP
0117857E 33C0 XOR EAX,EAX
01178580 BE 00010000 MOV ESI,100 ; ESI 에 100 저장. 10진수 256임.
01178585 EB 01 JMP SHORT 01178588 ; 256 번 루프를 돌면서 EBP-104 부터 0~ 0x256 을 모두 채움.
01178587 90 NOP
01178588 888405 FCFEFFFF MOV BYTE PTR SS:[EAX+EBP-104],AL
0117858F 40 INC EAX
01178590 3BC6 CMP EAX,ESI
01178592 ^ 72 F1 JB SHORT 01178585
01178594 EB 01 JMP SHORT 01178597
01178596 90 NOP
01178597 33C0 XOR EAX,EAX
01178599 33C9 XOR ECX,ECX
0117859B 3B45 14 CMP EAX,DWORD PTR SS:[EBP+14] ; 입력된 암호길와 같은지 아닌지 체크
0117859E 75 02 JNE SHORT 011785A2 ; 같지 않으면 쩜프.
011785A0 33C0 XOR EAX,EAX ; EAX 를 0으로 만들고 다시 처음부터 복사할 채비를 함...
011785A2 EB 01 JMP SHORT 011785A5
011785A4 90 NOP
011785A5 8B55 10 MOV EDX,DWORD PTR SS:[EBP+10] ; 입력된 패스워드 버퍼주소(스택)
011785A8 8A1410 MOV DL,BYTE PTR DS:[EDX+EAX] ; 256 번 루프를 돌면서 [EBP-208]에 패스워드 버퍼에 있는값을 복사한다.
011785AB 40 INC EAX
011785AC 88940D F8FDFFFF MOV BYTE PTR SS:[ECX+EBP-208],DL
011785B3 41 INC ECX
011785B4 3BCE CMP ECX,ESI
011785B6 ^ 72 E3 JB SHORT 0117859B
011785B8 897D 14 MOV DWORD PTR SS:[EBP+14],EDI ; 패스워드 입력 길이를 그냥 0으로 만드넹?
011785BB B8 FF000000 MOV EAX,0FF ; 255
011785C0 EB 01 JMP SHORT 011785C3
011785C2 90 NOP
011785C3 8A943D FCFEFFFF MOV DL,BYTE PTR SS:[EDI+EBP-104] ; EBP-104+i 로부터 1바이트씩 읽어온다.
011785CA 8B5D 14 MOV EBX,DWORD PTR SS:[EBP+14]
011785CD 8A8C3D F8FDFFFF MOV CL,BYTE PTR SS:[EDI+EBP-208] ; EBP-208+i 로부터 1바이트씩 읽어온다.
011785D4 8DB43D FCFEFFFF LEA ESI,[EDI+EBP-104] ; EBP-104+i 의 버퍼주소를 저장
011785DB 03DA ADD EBX,EDX ; EBX += EDX; 0 + 12F100
011785DD 03CB ADD ECX,EBX ; ECX += EBX; 131 + EBX
011785DF 23C8 AND ECX,EAX ; 1바이트만 남기기위하여...
011785E1 894D 14 MOV DWORD PTR SS:[EBP+14],ECX ; 요걸 길이 부분에?....
011785E4 EB 01 JMP SHORT 011785E7
011785E6 90 NOP
011785E7 EB 01 JMP SHORT 011785EA
011785E9 90 NOP
011785EA 8A9C0D FCFEFFFF MOV BL,BYTE PTR SS:[ECX+EBP-104] ; EBP-104 버퍼에서 31 만큼 떨어진곳에서 1바이트 읽음
011785F1 8D8C0D FCFEFFFF LEA ECX,[ECX+EBP-104] ; 그 주소를 저장함..
011785F8 47 INC EDI ; ++i
011785F9 881E MOV BYTE PTR DS:[ESI],BL
011785FB 81FF 00010000 CMP EDI,100 ; 100(256) 에 도달했는지 비교
01178601 8811 MOV BYTE PTR DS:[ECX],DL
01178603 ^ 72 BB JB SHORT 011785C0
01178605 33FF XOR EDI,EDI
01178607 897D 14 MOV DWORD PTR SS:[EBP+14],EDI ; 패스워드 사이즈에 다시 0을...ㅎㅎ
0117860A 50 PUSH EAX
0117860B 90 NOP
0117860C 90 NOP
0117860D 90 NOP
0117860E 90 NOP
0117860F 90 NOP
01178610 90 NOP
01178611 90 NOP
01178612 90 NOP
01178613 90 NOP
01178614 90 NOP
01178615 90 NOP
01178616 90 NOP
01178617 90 NOP
01178618 90 NOP
01178619 90 NOP
0117861A 90 NOP
0117861B 90 NOP
0117861C 90 NOP
0117861D 58 POP EAX
0117861E 397D 0C CMP DWORD PTR SS:[EBP+0C],EDI ; 암호화된 버퍼의 크기가 0인지 검사
01178621 897D 10 MOV DWORD PTR SS:[EBP+10],EDI ; 입력된 패스워드 버퍼주소를 0으로 만듦
01178624 76 64 JBE SHORT 0117868A ; 0 보타 같거나 작으면 점프
01178626 47 INC EDI ; 증가
01178627 23F8 AND EDI,EAX ; 255 를 넘어가면 0으로 만들기 위함인듯
01178629 EB 01 JMP SHORT 0117862C
0117862B 90 NOP
0117862C 8A943D FCFEFFFF MOV DL,BYTE PTR SS:[EDI+EBP-104] ; 0 번째 인덱스 부터가 아닌 1번째 인덱스부터 시작한다.
01178633 8D8C3D FCFEFFFF LEA ECX,[EDI+EBP-104] ; 그 주소를 저장함
0117863A 8ADA MOV BL,DL
0117863C 035D 14 ADD EBX,DWORD PTR SS:[EBP+14]
0117863F 23D8 AND EBX,EAX
01178641 8BF3 MOV ESI,EBX
01178643 8975 14 MOV DWORD PTR SS:[EBP+14],ESI
01178646 EB 01 JMP SHORT 01178649
01178648 90 NOP
01178649 EB 01 JMP SHORT 0117864C
0117864B C7 DB C7 ; Unknown command
0117864C 8A9C35 FCFEFFFF MOV BL,BYTE PTR SS:[ESI+EBP-104]
01178653 8DB435 FCFEFFFF LEA ESI,[ESI+EBP-104]
0117865A 8819 MOV BYTE PTR DS:[ECX],BL
0117865C EB 01 JMP SHORT 0117865F
0117865E 90 NOP
0117865F 8816 MOV BYTE PTR DS:[ESI],DL
01178661 EB 01 JMP SHORT 01178664
01178663 90 NOP
01178664 EB 01 JMP SHORT 01178667
01178666 90 NOP
01178667 8A09 MOV CL,BYTE PTR DS:[ECX]
01178669 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8] ; 암호화된 버퍼의 내용 BA267E
0117866C 8B5D 10 MOV EBX,DWORD PTR SS:[EBP+10]
0117866F 03CA ADD ECX,EDX
01178671 23C8 AND ECX,EAX ; eax = 0xff
01178673 03F3 ADD ESI,EBX
01178675 8A8C0D FCFEFFFF MOV CL,BYTE PTR SS:[ECX+EBP-104]
0117867C 300E XOR BYTE PTR DS:[ESI],CL
0117867E EB 01 JMP SHORT 01178681
01178680 90 NOP
01178681 43 INC EBX
01178682 3B5D 0C CMP EBX,DWORD PTR SS:[EBP+0C] ; 루프의 끝인지 판단..
01178685 895D 10 MOV DWORD PTR SS:[EBP+10],EBX ; 입력된 암호 버퍼의 공간에 복사..
01178688 ^ 72 9C JB SHORT 01178626
0117868A 50 PUSH EAX
0117868B 90 NOP
0117868C 90 NOP
0117868D 90 NOP
0117868E 90 NOP
0117868F 90 NOP
01178690 90 NOP
01178691 90 NOP
01178692 90 NOP
01178693 90 NOP
01178694 90 NOP
01178695 90 NOP
01178696 90 NOP
01178697 90 NOP
01178698 90 NOP
01178699 90 NOP
0117869A 90 NOP
0117869B 90 NOP
0117869C 90 NOP
0117869D 58 POP EAX
0117869E 6A 01 PUSH 1 ; true 인듯..
011786A0 58 POP EAX
011786A1 5E POP ESI
011786A2 5B POP EBX
011786A3 5F POP EDI
011786A4 C9 LEAVE
011786A5 C3 RETN
분석해 보니 상당히 복잡한 알고리즘.. 요걸 C 코드로 바꿔보았다. 인간 디컴파일러 -_-v
int unknow_func(
unsigned char *encrypted_buf_ptr, /* 암호화된 버퍼의 주소 [EBP + 8] */
int encrypted_buf_size, /* 암호화된 버퍼의 크기(216 BYTE) [EBP + 0C] */
unsigned char *password_buf_ptr, /* 입력된 암호 버퍼의 주소 [EBP + 10] */
int password_buf_size /* 입력된 암호의 길이 [EBP + 14] */
)
{
unsigned char seed_table[260] = {0,};
unsigned char xor_key_table[260] = {0,};
if(password_buf_size == 0)
{
return 0;
}
for(int i=0; 256>i; ++i)
{
xor_key_table[i] = i;
}
printf("XOR_KEY_TABLE 1 : \n");
for(int i=0; i<256; ++i)
{
if(i % 16 == 0) printf("\n");
printf("%02X ", (unsigned char)xor_key_table[i]);
}
printf("\n");
printf("SEED_TABLE 2 : \n");
int ref = 0;
for(int i=0; 256>i; ++i)
{
if(ref==password_buf_size) ref=0;
seed_table[i] = password_buf_ptr[ref++];
if(i % 16 == 0) printf("\n");
printf("%02X ", (unsigned char)seed_table[i]);
}
printf("\n");
unsigned int start=0;
unsigned int mask = 0x000000FF;
for(int i=0; 256>i; ++i)
{
unsigned int xor_key_val1 = xor_key_table[i];
unsigned int tmp = start;
unsigned int seed_val = seed_table[i];
unsigned char *xor_key_addr1 = xor_key_table + i;
tmp += xor_key_val1;
seed_val += tmp;
seed_val &= mask;
start = seed_val;
unsigned char xor_key_val2 = xor_key_table[seed_val];
unsigned char *xor_key_addr2 = xor_key_table + seed_val;
*((unsigned char *)xor_key_addr1) = xor_key_val2;
*((unsigned char *)xor_key_addr2) = xor_key_val1;
}
printf("XOR_KEY_TABLE 3 : \n");
for(int i=0; i<256; ++i)
{
if(i % 16 == 0) printf("\n");
printf("%02X ", (unsigned char)xor_key_table[i]);
}
printf("\n");
unsigned int start2 = 0;
unsigned int encrypted_buf_ref = 0;
int i = 0;
while(true)
{
encrypted_buf_ref = i;
if(encrypted_buf_size<=i)
{
break;
}
++i;
i &= mask;
unsigned char xor_key_val1 = xor_key_table[i]; // 0 이 아닌 1부터 시작..
unsigned char *xor_key_addr1 = xor_key_table + i; // ECX
unsigned int tmp1 = xor_key_val1;
tmp1 += start2;
tmp1 &= mask;
start2 = tmp1;
unsigned char xor_key_val2 = xor_key_table[start2];
unsigned char *xor_key_addr2 = xor_key_table + start2; // ESI
*xor_key_addr1 = xor_key_val2;
*xor_key_addr2 = xor_key_val1;
unsigned int tmp2 = *xor_key_addr1;
unsigned char *encrypted_buf_ptr_tmp = (unsigned char *)encrypted_buf_ptr;
tmp2 += xor_key_val1;
tmp2 &= mask;
encrypted_buf_ptr_tmp += encrypted_buf_ref;
unsigned char xor_key = xor_key_table[tmp2];
*((unsigned char *)encrypted_buf_ptr_tmp) ^= xor_key;
++encrypted_buf_ref;
if(encrypted_buf_ref < encrypted_buf_size)
{
}
else
{
break;
}
}
printf("XOR_KEY_TABLE 4 : \n");
for(int i=0; i<256; ++i)
{
if(i % 16 == 0) printf("\n");
printf("%02X ", (unsigned char)xor_key_table[i]);
}
printf("\n");
return 1;
}
알고보니…이게 RC4 암/복호화 알고리즘이라고 한다. 풀수없는………..젠장..
고객님..안되겠심미다.. 포기요~ 켁