티스토리 뷰
** 분석 중 문제 함수가 지역 변수 접근에 EBP 를 사용하지 않았음. (ESP 를 대신 사용함.)
Immunity Debugger 에서 LOCAL.n Prefix 를 사용하지 못함. IDA 를 이용해 스택 주소를 확인함.
1.
이름을 입력하면, 그에 맞는 시리얼 넘버를 계산한 뒤 입력한 시리얼 넘버와 일치하는지 확인하는 프로그램이다.
주어진 시리얼 넘버를 가지고, 이에 맞는 이름을 찾아내면 되므로, 시리얼 넘버를 생성하는 코드를 분석해 거꾸로 뒤집으면 된다.
2.
00401077 ~ 004010B4 while Loop
00401077 :
Counter_1 이 3 이상이라면 0으로 초기화함.
밑에서 ESP - 130h, -129h, -128h 주소로 차례대로 엑세스한다. (00401038 에서 값 대입)
0040107E :
load ESP - 130h + Counter_1 to ECX (Cl)
load ESP - 12C(이름 입력) + EBP(IDX) to EDX
ECX, EDX xor 연산 후 ECX 에 저장.
0040109A:
sprintf 로 ECX 값을 0x00 hex 포맷으로 저장함.
sprintf(char* buf_ESP-c8, char[] "%s%02X", char* buf_ESP-c8, byte ecx_xor);
Destination주소가 두번 들어가는데, 포맷 스트링을 보면, %s 가 대입되는 공간이 Destination 주소이므로,
이전 데이터 + 새로운 ecx xor 된 데이터 -> hex 처리 데이터가 ESP-c8 에 저장된다.
004010E6:
sprintf 된 데이터를 저장한 포인터를 esi 에 넣고, 시리얼 넘버를 저장한 포인터를 eax에 넣은 다음.
밑 구문에서 2바이트씩 가져와 hex string -> byte 변환 후 비교한다.
3.
a ^ b = c 일 때, c ^ b = a 를 이용해, 주어진 시리얼 키 "5B134977135E7D13" 를 다시 순서에 맞추어 xor 연산한 후 출력한다.
# jochiwon.tistory.com
# reversing.kr Easy Keygen
from binascii import unhexlify
bt = unhexlify('5B134977135E7D13')
answer = ''
key = [0x10, 0x20, 0x30]
x = 0
for b in bt:
answer += chr(b ^ key[x])
x += 1
if x == 3:
x = 0
print(answer)
답 : K3yg3nm3
참고
'Reversing > * reversing.kr' 카테고리의 다른 글
reversing.kr - ImagePrc (0) | 2016.07.22 |
---|---|
reversing.kr - Music Player (0) | 2016.07.21 |
reversing.kr - Replace (0) | 2016.07.19 |
reversing.kr - Easy Unpack (0) | 2016.07.18 |
reversing.kr - Easy Crack (0) | 2016.07.17 |