실행부는 이전의 문제와 동일하다.
00007FF7C9A63000 AD D8 CB CB 9D 97 CB C4 92 A1 D2 D7 D2 D6 A8 A5 .ØËË..ËÄ.¡Ò×ÒÖ¨¥
00007FF7C9A63010 DC C7 AD A3 A1 98 4C 00 00 00 00 00 00 00 00 00 ÜÇ.£¡.L.........
비교함수의 덤프까지 가져왔다.
어셈블리 코드의 비교함수를 자세히 살펴보면
00007FF7C9A61000 | 48:894C24 08 | mov qword ptr ss:[rsp+8],rcx |
00007FF7C9A61005 | 48:83EC 18 | sub rsp,18 |
00007FF7C9A61009 | C70424 00000000 | mov dword ptr ss:[rsp],0 |
00007FF7C9A61010 | EB 08 | jmp chall5.7FF7C9A6101A |
00007FF7C9A61012 | 8B0424 | mov eax,dword ptr ss:[rsp] |
00007FF7C9A61015 | FFC0 | inc eax |
00007FF7C9A61017 | 890424 | mov dword ptr ss:[rsp],eax |
00007FF7C9A6101A | 48:630424 | movsxd rax,dword ptr ss:[rsp] |
00007FF7C9A6101E | 48:83F8 18 | cmp rax,18 | 문자열 길이 0x18
00007FF7C9A61022 | 73 39 | jae chall5.7FF7C9A6105D |
00007FF7C9A61024 | 48:630424 | movsxd rax,dword ptr ss:[rsp] |
00007FF7C9A61028 | 48:8B4C24 20 | mov rcx,qword ptr ss:[rsp+20] | [rsp+20]:"asdfasdfasdf"
00007FF7C9A6102D | 0FB60401 | movzx eax,byte ptr ds:[rcx+rax] | eax에 입력된 현재 문자 저장(input[i])
00007FF7C9A61031 | 8B0C24 | mov ecx,dword ptr ss:[rsp] | ecx에 현재 인덱스 저장(i)
00007FF7C9A61034 | FFC1 | inc ecx | i++
00007FF7C9A61036 | 48:63C9 | movsxd rcx,ecx |
00007FF7C9A61039 | 48:8B5424 20 | mov rdx,qword ptr ss:[rsp+20] | [rsp+20]:"asdfasdfasdf"
00007FF7C9A6103E | 0FB60C0A | movzx ecx,byte ptr ds:[rdx+rcx] | ecx에 input[i+1]저장
00007FF7C9A61042 | 03C1 | add eax,ecx | eax에 input[i] + input[i+1] 문자 저장
00007FF7C9A61044 | 48:630C24 | movsxd rcx,dword ptr ss:[rsp] | rcx에 현재 인덱스 저장(i)
00007FF7C9A61048 | 48:8D15 B11F0000 | lea rdx,qword ptr ds:[7FF7C9A63000] |
00007FF7C9A6104F | 0FB60C0A | movzx ecx,byte ptr ds:[rdx+rcx] | ecx에 저장된 암호문의 현재 인덱스값 저장
00007FF7C9A61053 | 3BC1 | cmp eax,ecx | eax와 ecx비교
00007FF7C9A61055 | 74 04 | je chall5.7FF7C9A6105B |
00007FF7C9A61057 | 33C0 | xor eax,eax |
00007FF7C9A61059 | EB 07 | jmp chall5.7FF7C9A61062 |
00007FF7C9A6105B | EB B5 | jmp chall5.7FF7C9A61012 |
00007FF7C9A6105D | B8 01000000 | mov eax,1 |
00007FF7C9A61062 | 48:83C4 18 | add rsp,18 |
00007FF7C9A61066 | C3 | ret |
디버거를 따라가면서 확인해봤다.
input[i] + input[i+1] == str[i]가 되어야한다.
그렇다면 우리가 구해야 할 값은 input이고 str을 알고 있는데 i는 24까지 가며 덤프값을 통해 확인해봤을 때 str[24]는 00이다.
input[i] == str[i] - input[i+1]인데 최종 마지막에 들어가는 input[24]를 NULL로 생각하면서 한칸씩 내려오는 식으로 코드를 짜면 된다.
str = 'AD D8 CB CB 9D 97 CB C4 92 A1 D2 D7 D2 D6 A8 A5 DC C7 AD A3 A1 98 4C 00'
str = str.split(' ')
str.reverse()
res = ''
tmp = int(str[0], 16)
for i in range(0, 23): #0x18 == 24
tmp = int(str[i + 1], 16) - tmp
res += chr(tmp)
print(res[::-1])
사실 이번 문제를 4번문제와 동일하게 디컴파일된 함수를 그대로 파이썬 코드에 넣어서 풀었을 때 이상한 문자열이 출력됐었다. 왜냐하면 이번 문제는 문자열 하나 하나를 독립적으로 보는게 아닌 입력된 문자열에서 현재 인덱스와 다음 인덱스를 불러와서 계산을 하는 문제여서 역산이 필요한 문제였기 때문이다. 앞으로는 계산이 좀 더 필요할 것 같다.
'Security > Reversing' 카테고리의 다른 글
Dreamhack rev-basic-7 (0) | 2022.06.21 |
---|---|
Dreamhack rev-basic-6 (0) | 2022.06.01 |
Dreamhack rev-basic-4 (0) | 2022.05.25 |
Dreamhack rev-basic-3 (0) | 2022.05.24 |
Dreamhack rev-basic-2 (0) | 2022.05.23 |