실행부는 앞의 문제와 동일하므로 생략하고 바로 비교함수를 분석해보았다.
00007FF61F771000 | 48:894C24 08 | mov qword ptr ss:[rsp+8],rcx |
00007FF61F771005 | 48:83EC 18 | sub rsp,18 |
00007FF61F771009 | C70424 00000000 | mov dword ptr ss:[rsp],0 |
00007FF61F771010 | EB 08 | jmp chall6.7FF61F77101A |
00007FF61F771012 | 8B0424 | mov eax,dword ptr ss:[rsp] |
00007FF61F771015 | FFC0 | inc eax | i++
00007FF61F771017 | 890424 | mov dword ptr ss:[rsp],eax |
00007FF61F77101A | 48:630424 | movsxd rax,dword ptr ss:[rsp] |
00007FF61F77101E | 48:83F8 12 | cmp rax,12 | str길이 0x12
00007FF61F771022 | 73 31 | jae chall6.7FF61F771055 |
00007FF61F771024 | 48:630424 | movsxd rax,dword ptr ss:[rsp] | index
00007FF61F771028 | 48:8B4C24 20 | mov rcx,qword ptr ss:[rsp+20] | str
00007FF61F77102D | 0FB60401 | movzx eax,byte ptr ds:[rcx+rax] | str[i]
00007FF61F771031 | 48:8D0D E81F0000 | lea rcx,qword ptr ds:[7FF61F773020] | 주소 7FF61F773020
00007FF61F771038 | 0FB60401 | movzx eax,byte ptr ds:[rcx+rax] | rcx+rax(주소 7FF61F773020+str[i]에 저장된 값)
00007FF61F77103C | 48:630C24 | movsxd rcx,dword ptr ss:[rsp] | index
00007FF61F771040 | 48:8D15 B91F0000 | lea rdx,qword ptr ds:[7FF61F773000] |
00007FF61F771047 | 0FB60C0A | movzx ecx,byte ptr ds:[rdx+rcx] | rdx[i]
00007FF61F77104B | 3BC1 | cmp eax,ecx | eax와 ecx의 값 비교
00007FF61F77104D | 74 04 | je chall6.7FF61F771053 |
00007FF61F77104F | 33C0 | xor eax,eax |
00007FF61F771051 | EB 07 | jmp chall6.7FF61F77105A |
00007FF61F771053 | EB BD | jmp chall6.7FF61F771012 |
00007FF61F771055 | B8 01000000 | mov eax,1 |
00007FF61F77105A | 48:83C4 18 | add rsp,18 |
00007FF61F77105E | C3 | ret |
주석을 달아놓긴 했는데 정확히 어떤 의미냐면
주소 00007FF61F773020을 기준으로 덤프를 캡쳐해온 것이다. 이 주소에서 내가 입력한 문자열 str[i]를 더했을 때
00007FF61F773000 00 4D 51 50 EF FB C3 CF 92 45 4D CF F5 04 40 50 .MQPïûÃÏ.EMÏõ.@P
이 00007FF61F773000주소에 있는 헥스코드 값과 일치해야 된다는 것이다.
맛보기로 수작업으로 했을 때 첫 글자는 ~~~3020주소에서 str[i]를 더해서 00이 나와야 되므로 위 3020덤프에서 헥스값이 00인 주소는
~~~3072다. 첫 문자는 0x3072-0x3020 = 0x52 따라서 R이다. 첫 문자 R로 입력해서 디버거를 돌렸을 때 다음 루프를 들어가는 것을 확인하여 이가 맞음을 확인했다.
이렇게 되면 덤프 밑의 값까지 전부 확인해야되므로 코드를 짤때 어쩔 수 없이 전부 가져가야겠다. 아스키코드의 마지막 값은 7F이므로 ~~~309F까지 저장해서 풀었다.
dump = '63 7C 77 7B F2 6B 6F C5 30 01 67 2B FE D7 AB 76 CA 82 C9 7D FA 59 47 F0 AD D4 A2 AF 9C A4 72 C0 B7 FD 93 26 36 3F F7 CC 34 A5 E5 F1 71 D8 31 15 04 C7 23 C3 18 96 05 9A 07 12 80 E2 EB 27 B2 75 09 83 2C 1A 1B 6E 5A A0 52 3B D6 B3 29 E3 2F 84 53 D1 00 ED 20 FC B1 5B 6A CB BE 39 4A 4C 58 CF D0 EF AA FB 43 4D 33 85 45 F9 02 7F 50 3C 9F A8 51 A3 40 8F 92 9D 38 F5 BC B6 DA 21 10 FF F3 D2'
dump = tuple(dump.split(' '))
str = '00 4D 51 50 EF FB C3 CF 92 45 4D CF F5 04 40 50 43 63'
str = tuple(str.split(' '))
res = ''
for i in range(18):
res += chr(dump.index(str[i]))
print(res)
이번에는 디컴파일 없이 어셈블리어를 직접 하나하나 분석했다. 눈은 아픈데 굉장히 뿌듯하다.
시험기간인데 시험공부는 안하고 워게임이나 하고있다.
'Security > Reversing' 카테고리의 다른 글
Dreamhack rev-basic-8 (0) | 2022.07.05 |
---|---|
Dreamhack rev-basic-7 (0) | 2022.06.21 |
Dreamhack rev-basic-5 (0) | 2022.05.28 |
Dreamhack rev-basic-4 (0) | 2022.05.25 |
Dreamhack rev-basic-3 (0) | 2022.05.24 |