x32dbg로 열었다가 창이 안 켜지길래
머지 페이크인가..? 하고 삽질하다가
그냥 내 x32dbg가 안된다는 것을 깨달았다...
ollydbg로 하니까 된다...
로컬(windows 10), vm(windows 10, windows 7) 다 x32dbg로는 창이 안켜졌다. 왜 그런지는 모르겠다.
# ollydbg를 사용한다면 관리자로 실행하는 게 좋다.
1. AB 이렇게 두 문자만 넣으면 please.. 뭐시기가 뜸. 이거 우회해야 함.
1-1. 우회방법
문자열로 찾아서 해당 분기문의 CMP EAX,3을 CMP EAX,2로 바꾼다.
2. f8로 하나씩 실행시켜보다가
여기 맨 마지막 줄을 실행시키면 오른쪽 레지스터 값에 key값이 생성된 것을 볼 수 있다.
그렇다면, 그 위의 call 08.0045B850이 key값 생성 함수일 것이다.
3. 08.0045B850에 들어가보면 첫 번째 반복문을 볼 수 있다.
이 반복문을 보면 입력한 Name("AB")을 하나씩 반복문 돌면서 어떤 값을 생성해낸다.
이 반복문을 거치면 앞에서 봤던 key값의 맨 처음(AAC1)이 esi에 담겨있는 것을 알 수 있다.
< 디버거 계속 다시 실행하고.. 삽질 많이 했다...>
4. 아, 그렇다면 0-9a-zA-Z 의 조합(2)의 이 함수값이 문제에서 요구하는 5D88-53B4-52A87D27-1D0D-5B09의 맨 처음인 5D88과 같다면, 그게 답이겠구나.
4-1. 나머지 값들은 비교 안하나? 라는 질문에는..
다른 값들도 대충 보면 입력한 Name으로 만들어내는 값이다. 그러니까 굳이 다음 것까지 모두 비교할 필요는 없고, 그냥 맨 앞의 값만 비교해도 된다.
# 풀이 코드
import string
from itertools import combinations
all_string = ""
lower = string.ascii_lowercase
upper = string.ascii_uppercase
all_string += lower + upper
for i in range(10):
all_string+=str(i)
coms = combinations(all_string, 2)
for com in coms:
# com = ('A', 'B')
esi = 0
edx = 0
for c in com:
esi = ord(c)
esi = esi + edx
esi = esi * 0x772
edx = esi
edx = edx * esi
esi = esi + edx
esi = esi or esi
esi = esi * 0x474
esi = esi + esi
edx = esi
if hex(esi)[-8:-4] == '5d88':
print(com)
'워게임 > 리버싱' 카테고리의 다른 글
CodeEngn advance 5(vba) (0) | 2021.08.21 |
---|---|
CodeEngn - advance 4(x32dbg에서 덤프뜨기) (0) | 2021.08.21 |
댓글