티스토리 뷰

** 분석 중 문제 함수가 지역 변수 접근에 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


참고

http://zesrever.tistory.com/22


'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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함