실행해주면 비밀번호를 입력하는 창이 나오고
입력 값이 틀리면 틀렸다는 창이 나옵니다.
IDA로 까서 입력 값을 비밀번호랑 비교하는 부분을 찾아줍니다.
우선 GetDlgItemTextA 함수로 eax가 가리키는 주소에 데이터를 받습니다.
.text:0040109B mov edi, [esp+6Ch+hDlg]
.text:0040109F lea eax, [esp+6Ch+String]
.text:004010A3 push eax ; lpString
.text:004010A4 push 3E8h ; nIDDlgItem
.text:004010A9 push edi ; hDlg
.text:004010AA call ds:GetDlgItemTextA
이후 cmp 명령들을 찾아줍니다.
.text:004010B0 cmp [esp+68h+var_63], 61h ; 'a'
.text:004010B5 jnz short loc_401135
...
.text:004010B9 lea ecx, [esp+6Ch+Str1]
.text:004010BD push offset Str2 ; "5y"
.text:004010C2 push ecx ; Str1
.text:004010C3 call _strncmp
.text:004010C8 add esp, 0Ch
.text:004010CB test eax, eax
.text:004010CD jnz short loc_401135
...
.text:004010D1 mov esi, offset aR3versing ; "R3versing"
.text:004010D6 lea eax, [esp+70h+var_60]
.text:004010DA mov dl, [eax]
.text:004010DC mov bl, [esi]
.text:004010DE mov cl, dl
.text:004010E0 cmp dl, bl
.text:004010E2 jnz short loc_401102
.text:004010E4 test cl, cl
.text:004010E6 jz short loc_4010FE
.text:004010E8 mov dl, [eax+1]
.text:004010EB mov bl, [esi+1]
.text:004010EE mov cl, dl
.text:004010F0 cmp dl, bl
.text:004010F2 jnz short loc_401102
.text:004010F4 add eax, 2
.text:004010F7 add esi, 2
.text:004010FA test cl, cl
.text:004010FC jnz short loc_4010DA
...
.text:0040110D cmp [esp+68h+String], 45h ; 'E'
.text:00401112 jnz short loc_401135
.text:00401114 push 40h ; '@' ; uType
.text:00401116 push offset Caption ; "EasyCrackMe"
.text:0040111B push offset Text ; "Congratulation !!"
위 내용들을 종합해보면 아래 내용을 만족해야 합니다.
[esp+68h+var_63] == 'a'
[esp+6Ch+Str1] == '5y'
[esp+70h+var_60] == 'R3versing'
[esp+68h+string] == 'E'
주소 순으로 정렬해보면 다음과 같습니다.
.text:00401080 String = byte ptr -64h
.text:00401080 var_63 = byte ptr -63h
.text:00401080 Str1 = byte ptr -62h
.text:00401080 var_60 = byte ptr -60h
[esp+0x04] == 'E'
[esp+0x05] == 'a'
[esp+0x0A] == '5y'
[esp+0x10] == 'R3versing'
주소가 연속되지 않고 끊어져 있는데
왜 그런지 알기 위해 디버깅을 해보겠습니다.
'5y'를 비교하기 전 push 명령이 있었기 때문에 esp가 -4 되어서 A를 더했던 것 이었습니다.
이후 'R3versing' 문자열을 비교하는 것도 입력한 5번째 문자열부터 비교하는 로직입니다.
결론적으로 esp가 고정값이 아니기 때문에
직접 디버깅을 통해 알아내는 방법이 더 유효했습니다.
그렇게 문자열 순서대로 어떤 값과 비교되는지를 종합해보면
Ea5yR3versing이 키 값이 되는 것을 알 수 있습니다.
'write-up(rev) > reversing.kr' 카테고리의 다른 글
[reversing.kr] Replace write-up (0) | 2024.06.01 |
---|---|
[reversing.kr] Music Player write-up (0) | 2024.05.31 |
[reversing.kr] Easy ELF write-up (0) | 2023.08.30 |
[reversing.kr] Easy Unpack write-up (0) | 2023.08.30 |
[reversing.kr] Easy Keygen write-up (0) | 2023.08.18 |