시리얼이 5B134977135E7D13 일때 Name이 무엇인지 알아내면 된다.
프로그램 실행모습
IDA
참조하는 곳으로 가보자
여기서 유심히 보아야 할 곳이 보인다.
Name을 입력받아서 문자열 길이만큼 반복문을 돌린다.
i 가 3이 되면 0으로 초기화 해주고
문자열[i] ^ v7[i-1] , 즉 xor 연산을 해줘 버퍼에 저장해주는듯 하다.
그리고 시리얼과 연산된 버퍼를 비교해 분기한다.
IDA에서 더 알아보기엔 무리가 있으니 x32Dbg에 붙여보자
x32Dbg
위 IDA의 if ( i >= 3) i = 0; 이 있었다시피
cmp esi, 3으로 비교를 해주고 xor esi, esi를 통해 0으로 초기화 해주는게 보인다.
Name이 입력되면 [esp +10] 부터 차례로 10, 20, 30 을 넣어주고 있다.
ecx에 [esp+esi+c] 의 주소에 저장된 값을 byte로 가져와 저장 해주는게 보이며
0x10 이 ecx에 저장된다.
edx 에도 동일하게 가져와 넣어주는데, Input Name에 입력한 문자열을 가져오는게 보인다.
글쓴이는 Input Name 에 siyul을 써넣었다.
그리고 ecx 와 edx를 xor연산해준다. 그렇다면 이부분이 위의 IDA에서 봤던
v8[v3++] ^ v7[i 1] 이라는 말이된다.
edx와 edx에 저장된 값이 보이고, 우측사진에선 ecx에 xor연산을 끝낸 값이 저장된게 보인다.
주소로 가서보게되면 연산을 끝낸 값이 들어간게 보인다.
그리고 밑에서 esi를 1늘려주며 i++과 동일한 작업을 하게된다.
문자열길이만큼 루프를 돌았는지 비교후 다시 위의 cmp esi, 3 인스트럭션으로 점프하며
ida에서 본 반복문과 같다는걸 알 수 있다.
루프를 두번째 돌때는 20이 들어가는게 보인다.
좌측사진은 루프 두번째, 우측사진은 루프 세번째이다.
그렇다면 Name이 siyul 이라면 s ^ 0x10, i ^ 0x20, y ^ 0x30, u ^ 0x10, l ^ 0x20 을 수행한다는 걸 볼 수 있고
문자열의 길이만큼 0x10, 0x20, 0x30 을 반복해가며 xor연산해 Serial을 생성한다는 걸 알수있다.
이를 토대로
5B134977135E7D13 를 다시 xor 연산해주면 Name이 나올 것이다
c++로 xor구현
IDA에서 봤던 코드와 비슷하지 않은가? 어쨌든 실행해주면
Name이 튀어나오고 입력해주면
정답 !
'Reverse Engineering > [Reversing.kr] Challenge' 카테고리의 다른 글
[Reversing] Reversing.kr - Easy Unpack (0) | 2024.07.08 |
---|---|
[Reversing] Reversing.kr - EasyCrack (0) | 2024.07.07 |