레나 듀토리얼 - 1

리버싱|2021. 3. 24. 21:18

with 보안프로젝트

 

참고  MSDN

 

 

프로세스 : 프로그램이 실행 되는 것

 

메모리: 가상메모리에 프로그램 파일이 올라감

 

가상메모리:컴퓨터가 물리메모리를 효율적으로 사용하기위해서

물리메모리:8기가램

 

레지스터: cpu가 사용하려고 가지고 있는 데이터

 

eax

계산에 대한 저장을 하는 데이터

 

ebx

베이스 레지스터라는 것

 

ecx

카운터 레지스터(숫자를 세거나)

 

edx

데이터 레지스터

 

esi

소스 인덱스(출발지)

 

edi

데스티네이션 인덱스(목적지)

 

ebp

스택의 아랫부분 (베이스) 포인터

 

esp

스택의 윗부분을 가르킴(탑) 포인터

 

eip 

CPU가 다음에 실행할 명령어 주소

 

 

 

10진수 0-9

16진수 0-F 0123456789ABCDEF

4바이트 -> 32비트

 

eax -> 32bit

ax -> 16bit

ah/al -> 8bit

 

ctrl+F2

재시작

 

F8

한스텝 진행 (오버)

 

F7

한스텝 진행 (인투 즉 안으로들어가는 거)

 

 

=========================================

 

 

레나 듀토리얼 1

 

 

 

 

 

 

CALL 함수실행명령어 KERNEL32.GetModuleHandleA DLL 을 실행한다.

 

EAX의 값을 402177으로 MOV 즉옮겨라

 

 

ctrl+g 

목적지 주소 이동

402177 번지로 이동을 한뒤에

 

 

F8을 눌러 진행을 해보면

 

 

 

여기서 한스텝 F8을 진행을 할 시에

 

 

EAX 값이 402177로 들어간다.

 

그러면 즉

 

 EAX을 넣으면 데이터의 값이 들어간다.

 

그전에 EAX의 값이 400000번지 이기 떄문에 

400000이 들어가야되지만

 

메모리에 들어갈떄는 리틀인디안으로 들어가게된다.

거꾸로 들어가게되기때문이다.

 

그래서 00 00 40 으로 들어가게됩니다.

 

 

 

그리고

 

 

 

 

4003을 402197로 옮길것이다

 

그래서 F8 로 한스텝 진행해보면

 

 

 

 

 

실제로 리틀인디안으로 4003이

 

03 40 으로 들어가게 됬습니다.

 

 

가로에있는것은 주소지라고 생각하면되고 오른쪽에있는 데이터를 MOV 왼쪽에 넣겠다 생각하면 됩니다. 

 

 

 

이것은 반대로 402177에 있는 주소지를 EAX로 옮기겠다 라는 뜻입니다.

그래서 EAX 값에 400000이 들어간다.

 

 

그리고 EAX값을 4021A7로 옮긴다

 

 

 

 

 

 

 

 

 

PUSH 4 

 

스택에 푸시한다는 의미입니다 PUSH는 무조건 스택

 

 

 

 

 

원래 eax가 가지고있는 400000 번지의 값을 넣었다.

 

 

 

아그리고 함수에대한 리턴값은 EAX에 저장이됩니다.

 

마지막 함수의 결과는 EAX에서 대부분 확인이 가능합니다.

 

 

 

 

저기에 F2로 브레이크 포인트를 걸고

 

F9를 누르게되면 저기까지 계속 실행 되게 된다.

 

Createfilea는 

 

 

여기는

 

createFileA를 실행하기위해서

 

call 하기전에 많은 스택을 push를 했는데

 

함수를 실행하기위해서 여러 인자가 필요하게되는데 

 

저 인자들을 전달했다 라고 보시면됩니다. 

 

 

 

 

 

저상태에서 f8을 누르게되면 원래 이값이였던게

 

 

 

 

 

갑자기 FFFFFFF으로 바뀌게 됬습니다.

 

CALL  KERNEL32.CreateFileA 함수의 결과를

 

FFFFFFF로 돌려준 것 입니다.

 

FFFFFFF는 만약에 함수가 실패를 하면 이 값을  알맞지않는 핸들이라는 뜻으로 리턴해주는 것입니다.  

 

 

참고로 CreateFileA는 파일을 만들떄도 사용하지만 파일을 열때도 사용을 하는 함수입니다.

 

 

 

만약 이것처럼 이 함수가 실행에 실패했을때

 

저기옆에있는 파라미터를 확인하는 것이 좋습니다.

 

 

 

읽기모드로 열었다.

 

그리고 OPEN_EXISTING 모드로 열었고

 

OPEN_EXISTING

 

즉 PUSH 3 을 한이유도 저것을 사용하기위해서 한것입니다.

파일이나 장치가 있는 경우에만 열게되는데

 

 

 

 

 

 

reverseme가 있는 파일 위치에서

 

OPEN_EXISTING이 KeyFile.dat를 여는 행동인데

이파일이 없기때문에 오류가나서

 

함수가 실행을못해서 

FFFFFFFFF 이 나온다 !!!

 

 

 

CMP EAX, -1 

 

 

FFFFFFFF 은 -1 같은데

 

0에서 -1을 하면 원래 -1이되지만   

 

여기서는 양수밖에 존재하지않아서 레지스터에서 사이클이 돌아서 FFFFFFFF 로 가득찹니다

 

 

CMP EAX, -1 

에서 실패했는지 여부를 확인해서 비교한다 라고보면된다.

 

 

 

여기서 F8로 한스탭실행하면 

 

Zeroflag 가 1이되는데

 

같으면 1이 뜨게됩니다.

 

JNZ 는 JUMP IF NOT ZERO 1이 아니면 점프를 해라 라는 뜻입니다.

 

(즉 함수실행이실패하면 값이0이니까 제로플래그가 1올라가서점프가된다)

그래서 0040109A로 점프하게됩니다.

 

 

 

만약 점프를 하지않으면 저쪽에서 알수가있는데

 

MessageBoxA를 띄우고 ExitProcess종료하게됩니다.

 

 

 

 

CALL MessageBox를 할때 어떤 값

 

 

Evaluation period out of date 가 있는데이터가 들어가있는 것을 들어간걸 알수있다.

 

 

이렇게 실행이되는 것이다.

 

 

 

 

 

zero Flag를 0으로 만들면 (원래 1)

우리가 직접 zero Flage가 0인척 을합니다.

 

exit process를 넘어갈 수 있는 것입니다.

 

 

그래서 f8로 넘어가서 종료하지않게 진행을하면

 

 

 

이 함수가 열렸을떄

 

ReadFile을 하게됩니다.

 

hFile(핸들파일) 은

열었을때 지금은 ffffffff지만

 

정상적으로 열리면 핸들을 반환해주고 파일을 제어,다룰 수 있다.

핸들에대한 숫자가 들어가게된다.

 

Buffer 는

이 데이터를 어디다 쓸건지 세팅을 해준다

 

BytesToRead 

몇바이트나 읽을꺼냐

16진수로는 46바이트 10진수로는 70바이트

 

ReadFile

데이터를 읽어들이고 어딘가에 저장할 거다

 

 

pBytesRead

는 실질적으로 읽어들인 바이트의 개수를 의미한다.

실질적으로 몇개의 바이트를 가져왔냐.

 

 

그뒤로 진행을하면

 

 

EAX가 0인지를 검사합니다.

테스트를 한다생각하면됩니다

0이여서 Zero Flag 가 1입니다.

 

 

점프를 JNZ 는 점프낫 제로 니까 제로면 점프 하지 않으니

 

JMP로 넘어가서 점프를 하게됩니다. ( 즉 무조건 점프)

 

 

그래서 점프를 하면

 

이렇게 키가 없다 라는 메세지 박스를 출력하게되고

종료하게 됩니다.

 

 

하지만 우리의 목적은 키가 있는 척을 하는 것 입니다.

 

 

 

 

 

그래서 점프하기전으로 돌아와서 Zero Flag 를 0으로 만들고

성공한 것처럼 속인것처럼 진행한다

 

 

 

xor 비교연산을하고있다.

 

 

 

복잡한 알고리즘을 통과해야 

성공을 할거같은데 다 가도 결국에는 실패하게 나옵니다.

 

 

 

 

 

 

 

 

문자열을 확인할 수 있는데

 

이것을 참조해서 congatz를 가고싶다.

 

거기를 가고싶을때 더블클릭을합니다.

 

 

그래서 가보면 이곳을 가야 정확히 성공을 하게되는 것 같습니다.

 

그래서 push와 연결된 곳을 위로 올라갑니다.

 

즉 점프하는 공간을 들어가는것

 

 

점프한곳을 가보니 저곳이였습니다.

 

그니까 저곳까지 순조롭게 진행을 해야만이 성공을 할수 있는 것입니다.

 

 

그래서 진행을 해보면 JL이란게있는데

 

점프 레스 댄 즉 비교해서 누가 더 작냐 라는 뜻

 

JG 는 누가 크냐

JE 는 같으면 점프해라  점프 이퀄 이라는 뜻.

 

 

그래서 S를 0으로 바꿔주게되면

점프하는게 꺼지고

점프를 하고

 

CMP ESI, 8 

8과 ESI 값을 비교하고 있습니다.

 

그리고나서 S1 인데

또 그전보다 작으면 점프해 라는 걸 물어보고있으니까

저기서 또 S를 0으로 만듭니다.

 

그리고 점프를 JMP에서 실행을 하면!

 

 

 

오는데 성공했고

 

 

메세지박스를 띄우는데성공했습니다.

 

 

 

 

근데 파일을 이렇게 성공시켰는데 계속실행할때마다 이렇게 작업을 반복해야되는데

 

즉 이파일을 안하게 루틴을 만든다

 

즉 수정을해서 저장하면 크랙 프로그램이 만들어 지는 것입니다!!!

 

 

 

 

CTRL E를 눌러서

 

JMP로바꿔줍니다.

즉비교안하고 점프하겠다.

 

 

 

 

점프로 수정하고

 

NOP은 no operation즉 아무것도 실행하지 않게 바꿉니다.

 

그래서 아무것도 실행하지않게 만들고

 

그뒤에

JL 그전보다 작을떄 점프하는 조건이 붙어있으니까 NOP으로 바꿔줍니다.

 

 

그리고 엔터를 누르면

 

이제 점프까지 완벽하게 할수있게되는 것 입니다.

 

 

 

그리고 수정한 부분을 드래그한 뒤에 selection을 하고 

 

 

save file을 합니다.

 

그러면 이제 우리가 수정한 파일을 저장을 할수 있는것입니다.

 

 

그래서 보니까 이런식으로 크랙 파일을 만들 수 있었습니다.

 

 

 

 

'리버싱' 카테고리의 다른 글

upx 수동언패킹  (0) 2021.03.28
레나 듀토리얼 - 4  (0) 2021.03.26
레나 듀토리얼 - 3  (0) 2021.03.26
레나 듀토리얼 - 2  (0) 2021.03.25

댓글()