-
6. [reversing.kr] Easy Keygen프로그래밍/Reversing 2022. 4. 12. 21:24반응형
0단계 - 다운로드
1단계 - 프로그램 실행해보기
다 입력하면 성공, 실패 메세지 볼 틈도 없이 꺼진다.
2단계 - 패킹되어있는지 확인
3단계 - 해보기
이번엔 스트링으로 찾아볼까
4단계 - 수정
실패부분으로 오는 곳이 한 군데 밖에 없으니 그 부분만 nop해주면 끝
근데...이 문제가 아니었던거 같은데??ㅋㅋㅋㅋ
다시 3단계
5B134977135E7D13일때 값이니까
값들어오고 valid키인지 확인하는 부분에 브레이크 포인트를 걸고 봐야겠다.
abcdefuckyou를 또 넣어줬다 ㅋㅋㅋ
첫글자는 2
두번째 글자는 5
이거 그냥 esi에 저장된 25620123140927170123157527640123
이게 답인거같은데..
맞네...
어?? 아 진짜 바본가 ㅋㅋㅋㅋ
시리얼이 5B134977135E7D13일때의
이름이니까 반대로 찾는거 였다..
문제를 잘 읽자...
또 다시 3단계...
시리얼 넘버가 생성되는 부분이 일단 이름을 받은 다음에 생성되는걸로 추정됨
일단 이름은 abcdefg로 넣었다.
그래서 이쯤에 브레이크 포인트를 잡아 보았다.
따라오니 콜문 뒤로는 프로그램이 실행되길래 기존 브포는 지우고 값을 받은 리턴부분에 다시 브포를 걸어주었다.
최하단을 보면 시리얼 번호를 입력하는 글자가 있고
아까 비밀번호가 edi에 저장이 된다는 사실을 알아냈다.
역시나 바로 위4010BD를 보면 lea edi, dword ptr ss:[esp+10]이 있는데
이 부분이 edi에 시리얼번호를 넣어주는 부분 으로보인다.
그럼 이제 이 부분을 알아먹어야되네요?
저 어셈블리어 진짜 못하는데....
흠.. 한줄씩 공부하면서 알아가봅시다.
lea edi,dword ptr ss:[esp+18]
edi에 esp+18의 주소를 넣는다
오 잘 들어갔고
or ecx,FFFFFFFF
ecx 를 FFFFFFFF로 만들어줌
xor eax,eax
eax=0 로 만들어주기
add esp,8esp에 8을 더함
xor ebp,ebp
ebp=0
xor esi,esiesi=0
repne scasb
이게 뭐지.. 처음 보는건데.. repne(REPeat until Not Equal) 같지 않을때 까지 반복
scasb 는 또 뭐지...
edi를 1씩 증가하는 만큼 ecx가 1씩 줄어들었음.
여기를 거치고 ecx가 FFFFFFF7 이 되었다.
=> abcdefg 문자 개수를 셌다.
not ecxnot(ecx) ... ecx는 뒤집혀서 00000008이 되었다.
dec ecx한글자가 많으니 ecx를 1 줄여서 00000007이 됨
결국 여기서 문자개수 7이라고 나옴
test ecx,ecxecx가 0인지 아닌지 판별
jle easy keygen.4010B6
ecx가 0이거나 그보다 더 작으면 4010B6으로 보냄
cmp esi,3 (밑에서 반복으로 다시 올라올 부분)
esi와 3을 비교 (= esi 에서 3을 빼봄)
jl easy keygen.40107E비교한 값이 3보다 작으면 40107E 로 보낸다 (밑에 esi 0초기화 단계를 건너 뜀)
jl(Jump if Less than that)
esi 값이 0 이어서 결국 40107E로 점프
xor esi,esi
esi = 0
이제 esi는 3보다 작게 나오게 됨 - > (0~2)
movsx ecx,byte ptr ss:[esp+esi+C]16 -> 32비트로 확장 (부호있음) cf. 부호없이 확장 movsx
ecx에 [19fdf8 + esi + 7] 에 있는 값을 넣어준다.
저부분을 follow in dump 해서 가보니 10 이 있다.
movsx edx,byte ptr ss:[esp+ebp+10]
edx에는 [esp+ebp+10] 을 넣어주는데 거기는 abcdefg의 a가 있는 곳
edx는 61이 들어간다.
xor ecx,edx10과 61을 xor
ecx에 71이 들어가게 된다.
lea eax,dword ptr ss:[esp+74]eax에 esp+74의 주소를 넣는다.
(시리얼이 저장될 부분)
push ecxecx에 있는 71을 스택에 쌓음
push eaxeax에 있는 주소를 스택에 쌓음
lea ecx,dword ptr ss:[esp+7C]
앞에서 설명안했었던것같은데 esp는 스택의 맨윗부분이다.
esp+7C = 19FDF0 + 7C = 19FE6C
ecx에 19FE6C 주소를 넣어준다.
push easy keygen.408054스택에 쌓는다.
push ecx
ecx를 스택에 쌓는다
call easy keygen.401150
콜문... 인내심에 한계가 생기고 있다..
대충 봐도 안에 콜문이 두개나 있다.. 이걸 계속 해야하는 걸까?
한번 따라 가봤는데 필요없는 부분을 건드리는 것 같아서 다시 리턴으로 복귀
콜문 전후 레지스터값 비교했는데 별 영향 없을듯
add esp,10esp에 10 증가
inc ebp
ebp + 1
lea edi,dword ptr ss:[esp+10]
edi에 abcdefg 있는 주소 넣어줌
or ecx,FFFFFFFF
ecx를 FFFFFFFF로 만들어줌
xor eax,eax
eax 0으로 초기화
inc esi
esi 1추가
repne scasb
글자 개수 어? 이거 익숙한데
not ecx
not(ecx)
dec ecxecx-1
글자개수 셌음
cmp ebp,ecx아까 ebp +1 로 1됐는데 ecx(글자수)를 빼줌
jl easy keygen.401077
작으면 401077로 가서 esi를 비교
이렇게 올라가서 몇 번 반복
esi가 0, 1, 2로 반복 하고 다시 0으로 돌아오니
한 글자 씩 읽으면서 19FE04의 10, 20 ,30 hex를 xor해주고 답으로 저장해줄것이다.
그러니까...
a xor 10, b xor 20, c xor 30, d xor 10, e xor 20, f xor 30, g xor 10
이런식으로 답이 나올것
mov ecx,19ecx에 0x00000019를 넣어준다.
xor eax,eaxeax 0으로 초기화
lea edi,dword ptr ss:[esp+10]
edi에 name을 넣어준다.
와.. 시간은 오래 걸렸지만 그래도 한번 쭉 보니 많은 도움이 됐다.
4단계
우리가 알고 있는 시리얼이 5B134977135E7D13이니까
name 한글자씩 xor (10,20,30) 순서로 되니까
두개씩 나눠 보면
5B 13 49 77 13 5E 7D 13
이름은 8자리로 나올 것이다.
이름 첫번째 글자 xor 10 = 5B
이름 두번째 글자 xor 20 = 13
이름 세번째 글자 xor 30 = 49
이름 네번째 글자 xor 10 = 77
.
.
.
문제는 이걸... 어떻게?? xor의 반대는 뭐지???????
리버싱하는 사람들은 정말 똑똑한 사람들이었구나...
공부할게 뭐이리 많은지..
5B xor 10 = 4b
4b xor 10 = 5b
xor은... 이런식이구나
이름 첫번째 글자 = 5B xor 10
이름 두번째 글자 = 13 xor 20
이름 세번째 글자 = 49 xor 30
이름 네번째 글자 = 77 xor 10
.
.
.
이렇게 구하면 되겠네..
C언어 기억은 가물가물하고 ..
요즘 대세라는 파이썬을 켜보자...
이렇게 serial이 5B134977135E7D13 일 때 name은 K3yg3nm3
아.. 쉬어야겠다..
easy라면서요.......ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
반응형'프로그래밍 > Reversing' 카테고리의 다른 글
8. [reversing.kr] Easy Unpack me (311) 2022.04.13 7. [reversing.kr] Music Player (313) 2022.04.13 5. [reversing.kr] EasyCrack (317) 2022.04.11 4. api검색하기 귀찮을때 x64dbg 플러그인 (312) 2022.04.11 1. 리버싱 공부 시작 (319) 2022.04.10