레나 듀토리얼 - 2
이번 2레벨 에서는
이 키파일을 지워줍니다.
왜그러냐면 이번에는 라이센스 키를 만드는 목적 입니다.
키파일을 지우니 1번과 같이 똑같은 메세지 박스가 뜨게됩니다
이제 올리디버거로 열어봅시다.
1레벨 때했던 것처럼
CreateFileA
는
keyfile.dat가 있어야 열리는 것입니다.
그리고 우리는 key파일을 하나 만들어봅니다.
메모장에 저것을 엽니다.
그리고 abcd하고 저장을 하게되면
keyfile 이 있으므로 실행이될거라 판단이됩니다
그래서 f8을 누르면 잘실행이되고
점프도 잘해주고 잇습니다.
그런데 지금처럼 4글자 밖에 없다라고하면
pBytesRead 에 4byte만 적힙니다.
덤프창에 저위에있는 Buffer 0040211A에
abcd 즉 우리가 keyfile에 넣었던 값이 잘 전달이되는지를 확인해 봅니다.
그랬더니 진짜로 abcd 값이 잘 전달이 되는 것을 알 수 있습니다.
몇바이트를 읽었는지도 402173에도 가봅니다.
가보면
진짜로 4바이트 읽었다는 것을알수 잇습니다.
파일 읽기에도 성공을했으니까 강제로 우리가 제로플래그를 변경할 필요가 없습니다.
그래서 점프를 해보면
XOR EBX, EBX 를 하는데 초기화를 하는 것입니다.
Xor은
A ^ B =
1 1 = 0 즉 같으면 0
0 0 = 0
1 0 = 1
0 1 = 1
실제 EBX의 값을 이렇게 1과 0으로 이루어진 데이터입니다.
그래서 EBX,EBX를 XOR시키게되면
결국 같은 값을 연산하니까 데이터는 0이됩니다.
결국 같은값을 한다는 것은 데이터를 0으로 만드는 것입니다.
즉 초기화 시킨것
같은값을 가리키면 초기화를 시킴
EBX와 ESI를 사용하기위해서 초기화 하는것 !
CMP
402173과 10 을 CMP를 하는데
16진수기때문에 10바이트입니다.
402173은 pBytesToRead
즉 402173 은 4로되있는데
10과 비교를 하게됩니다.
그럼 스몰 값이 S1이 되는데
그래서 보면 점프를 하게되는데 여기서 안좋은곳으로 종료합니다.
그래서 abcd는 현재 4바이트 밖에되지않으니까
그래서 cmp를 통과하기위해 문자를 더넣습니다.
잘보면 11바이트인데
이게왜그러냐면
최소한 16바이트가 들어가야합니다. 일단은 17바이트로 합니다.
그래야 16바이트가되서
16진수의 10바이트는
10진수로 16바이트
이것보다 같거나 더크게 만들어야 cmp를 통과 할 수 있습니다
그래서 cmp 402173 (주소와), 10
을 비교하는 말은 10진수에서 16바이트는 16진수에서 10바이트
그래서 16바이트이상의
즉 16글자 이상의 문자를 넣어야
10진수로 16바이트가 되서
cmp 402173,10 이 같게된다.
참고로 저 cmp 402173, 10 에서 10은 헥스 값이기때문에
키파일에 10진수 16개를 넣어야 한다.
그래서 헥스값(16진수값)으로는 11바이트고
10진수로 따지면 17바이트여서 저위에 헥스값에 11이 나타나는 것
EBS+40211A 에서 데이터를 가져와서 AL에 넣는 것을 알수있습니다
0을 가져오게되
는데
0은 아스키값으로 30이여서 즉헥스값을 30
문자 0은 30이기때문에
0옆에 30이 저위에 붙어있는것입니다.
그래서 AL값이 헥스값으로 30 즉 0이니까
CMP AL, 0
마지막 바이트는 0은 문자열의 끝을 의미합니다.
문자 0 과 숫자 0은 다르기떄문에 점프를 하지않고
47은 대문자 G라는 사실을 알 수 있습니다.
MOV 우리가 입력한값의 데이터를 AL 에다 저장하고있고
CMP AL, 0 을 비교하고있습니다
CMP AL, 0
0은 문자열의 끝을 의미합니다.
그래서 문자열 끝과 같다면 즉 우리가 키파일설정한것에 마지막 문자라면
이제
JE SHORT reverseM.004010D3 을 점프할수있지만
마지막 문자열 이 아니면 불가능합니다.
근데 JE AL, 0 이 서로 같게된다면 점프를 하게되는것인데
현재 우리가 넣은 데이터값이 모두끝나게될때 왜냐 우리가 넣은 데이터를 비교했을떄 JUMP를 진행하는것입니다
이곳을 계속 반복하고있는데
G가 8개이상이고 길이가 16바이트 이여야한다.
왜그러냐면면 저기를 넘어가기위해서는
CMP AL, 47 과 비교를 합니다 그러면 G와 비교를 해야하고 G는 아스키값으로 47이기때문에
근데 INC ESI니까 ESI의 값이 8이여야하면
G를8번 반복을 진행해야합니다.
그리고나서 우리 아까봤을떄는 16바이트 이상이여야 헥스값에 10이들어와서 루틴에 만족을 하기떄문입니다.
JNZ 는 점프낫 제로 즉 제로플레그가 0일떄 점프를 하는 것
즉 CMP AL,47 과 같지 않을때 점프를 하는것이다
제로플레그가 1이면 둘이 같기때문에 점프를 하지않음
JNZ를 한다 . 47(G문자) 와 AL의 값이 같지않을때 진행을합니다.
18바이트로 진행해보면
GGGGGGGG0000000000
1.Keyfile.dat 파일 반드시 있어야 함
2. 파일안에 16바이트 이상의 키 길이 필요
3. 그중 8바이트 이상의 문자가 대문자 G이여야한다.
esi 가 increase 증가 되면서 1로 바꼇고
ebx 도 실행되면 순번이 상승했고
EBX 에 1이 있으니까 첫번째꺼를 검사를 하겠다.
40211A 로가면 이제 두번째값을 검사할테고
계속오르고 9번부터는 31이 등장을 하게되니까
헥스덤프에서
ESI는 증가하지않고 EBX만 증가를 합니다.
EAX에도 순서대로 진행이된다.
거의 끝까지 왔고
헥스덤프에서 38이 마지막 (우리가 키파일에 넣은것은)
그래서
이제 마지막을 하면
점프를 마지막으로할수있는데
이제 여기까지 올수가 잇는 것입니다.
성공!
마지막 이부분에 대한 설명 (가장중요하니)
CMP 402173,10
10과 402173을 비교하는데
우리는 GGGGGGGG0000000 총 16바이트를 넣었으니까 10진수인데 16바이트이다
그래서 16진수에서 10바이트 가 10진수에 16이니까
10과 비교하고
JL 004010F7
그전에 CMP 402173,10 을 한게 만약 같지않는데 더작다면
점프를한다.
그리고 EBX+40211A는 0인데 0을 AL에 넣고있다
0은 아스키코드로 30이다
그리고
CMP AL, 0을 비교하고있고
JE 4010D3
CMP AL, 0 비교한 값이 만약 같다면 점프해라
즉 문자를 다비교하고 아무것도 없다면 점프해라 라는 의미로 생각하자
CMP AL, 47
47 과 AL 을 비교한뒤에
JNZ
점프 낫 제로 제로가아니면 점프해라 라는 것인데 AL과 47이 아스키로 G문자인데
GGGGGGGG0000000를 우리가 메모장에 넣었으니까
우리는 G 8번이 끝나게되면 점프를 하고 아니면 계속 ESI 값이 증가
INC ESI
ESI 값이 증가
INC EBX
EBX 값이 증가
JMP 004010C1
004010C1로무조건 점프
CMP ESI, 8
뭐냐면 ESI 값 즉 우리가 했던것이 G가 8번이상이 들어가야 CMP ESI,8이
더 작아지지않아서
JL 004010F7
값이 더작게되면 점프만약 같지않는데 더작다면 004010F7로
점프를한다.
근데
8개를 넣었을때는
이제 점프를 성공한 곳으로 갈수있는것
10과 402173을 비교하고
CMP 402173,10 을 한게 만약 같지않는데 더작다면
점프를한다.
그리고 EBX+40211A는 0인데 0을 AL에 넣고있다
0은 아스키코드로 30이다
CMP AL과 47 을 비교하며
47은 문자 G이여서 둘이 같기때문에
JNZ 는 점프낫 제로 즉 제로플레그가 0일떄 점프를 하는 것
즉 CMP AL,47 과 같지 않을때 점프를 하는것이다
G 가아니고 0일떄 점프가되는거여서 INC ESI 를 해도 0일 순서에서는
ESI값이 올라가지않고 EBX는 계속해서올라간다 반복을 계속 한다.
그리고 CMP AL, 0 마지막비교할 문자가없고그럴때이제 마지막으로 점프를 하게된다
둘이같을떄 점프하라는 JE가들어있기때문에
그리고 ESI값이 8이상인지확인한다(G를 8개이상넣었을떄 통과가능)
그리고 JL 8보다 작으면 종료하고 미안하다는 메세지박스 출력
8개보다 그게되면 이제 성공을 할수있는 것이다
그니까 16바이트 문자열 이상과 G8 개를 포함하여야만 가능한 라이센스 키를 만들어봤습니다.
'리버싱' 카테고리의 다른 글
upx 수동언패킹 (0) | 2021.03.28 |
---|---|
레나 듀토리얼 - 4 (0) | 2021.03.26 |
레나 듀토리얼 - 3 (0) | 2021.03.26 |
레나 듀토리얼 - 1 (0) | 2021.03.24 |