리버싱 기초 - c 문법과 어셈블리어

악성코드 및 포렌식|2021. 3. 6. 11:37

 

 

 

 

 

temp라는 함수와 main이라는 함수를 가지고있다

 

근데 main 함수에서는 temp (1)를 하고있고

 

int b는 지역변수

 

a==1 이면 a++을해주고

아니면 b++ 을 해라~~~~

 

a== 1이면 b= 1

a != 1 이면b=2 

이것을 

어셈블리어로 만들게된다면

 

 

 

 

 

 

 

윗부분은 함수프롤로그

밑부분은 함수 에필로그

 

사실은 위에와 밑에는 딱히 분석할 필요가없고

 

중간부분이 중요합니다.

 

왜냐면 중간부분이 함수의 역할을  수행하기 때문에

 

 

loc_40101C는 사람이 쉽게 만들어놓은것입니다.

그냥 표시해둔것이다

 

이거왜 표시했냐면

 

JMP하는 구간을 쉽게 찾기위해서 표시한거

점프할때는 이런식으로 진행을 합니다.

 

 

 

 

 

 

 

mov dword ptr [ebp-4], 1      이게 b가된다.

cmp dword ptr [ebp+8], 1    이게 a가되고

 

-4하면 temp꺼

+8하면 main꺼

-가 위가되고

+가 밑으로 오기 때문에

 

a,b가 정해지는 이유는 앞에서는 int =b 를 temp에서 지역변수를 선언했었기 때문에 ebp-4를 하면 위에 temp부분으로 가기때문에 b가 된다.

 

 

 

jnz short loc_40101c가나오게되고

이 의미는 ebp+8 이 a 이고 a와 1을 둘이 비교해서 같지않다면 loc_40101C로 가라!!!!!라는 의미 입니다

 

 

compare 비교하는 내용이 위에서 나왔습니다 그리고

jnz는 점프가 아니고 또

jmp는 어떤 조건없이 무조건 점프하게되는 내용인데

 

jnz는 jump if not zero 라는 뜻으로 0이아니면 점프해라!!!!

결론은 위에서 비교한 결과가 결국 같지 안다면 점프해라 라는 의미를 가집니다!

 

근데 비교한 결과가 현재는 a=1이라는 비교결과가 같으니까 그냥 다음으로 한칸넘어갑니다.

 

 

 

 

그래서 같다면 저부분이 IF 부분이 됩니다

 

mov eax, [ebp+8]

이부분은 ebp+8 이 현재 a를 가르키는말이고

그것을 eax에 넣습니다

 

그리고

add eax, 1

eax가 a인데 이 a에 1을더해라~~

 

그리고

mov [ebp+8], eax

 

아까  eax가 a+1 인데

a+1 을 a에 넣어라

그래서 a+1 이됩니다.

 

 

그리고 나서 jmp short loc_401025

로 점프해라

 

그리고 밑에 loc_401025 부분부터

 

스택정리~~~~

 

 

 

dword 하면 4바이트 이고 ptr 은 그냥 포인터 개념

 

 

 

 

 

 

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

 

 

반복문

 

 

 

 

 

 

 

 

함수 프롤로그 에필로그 제거하고

 

ebp -8은 루프함수쪽으로 가게되고

 

jmp short loc 401018로점프한다 무조건 점프한다

 

cmp dword ptr [ebp-8], 100h

바로 i와 100h 비교를 하게됩니다.

그리고나서 

 

jg short loc_401035  

jg는

jump if greater than 은 ~~~보다 크다면~~~~~ >이런뜻

jump if less than 은 ~~~보다 작다면~~~~이런뜻

 

 

아까위에서cmp dword ptr [ebp-8], 100h 보다 크다면~

점프를 loc 401035 로 점프를 해라

그러면 함수 에필로그가 나오고

정리한다. 

for 문을 끝내는 역할을 하게된다.

 

 

만약 점프를 하지않고 100보다 이하인 조건을 만족하게된다면

 

moc ecx, [ebp+8]      c를 ecx에넣고

syb ecx,                  c를 --해라 

mov [ebp+8], ecx       c-- 한 값을 c에 넣어라 

mov edx, [ebp-4]                  b의 값을 edx에 넣어라 ebp-4가 b이기때문에

add edx, 1            b의 값에 1을더해라

mov [ebp-4], edx      b+1 의 값을 [ebp-4] 즉 b에 저장을해라

그리고 jmp short loc_40100F로 점프를 해라 !

 

그리고 비교하고~~~ 뭐하고 계속해서 비교만주구장창합니다

 

 

그러다가 100보다 커지만 아까위에 설명했던 것처럼 함수에필로그로 이동해서 결론을 내는 것입니다.

 

 

 

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

 

 

 

구조체와 API Call

 

 

 

 

 

 

 

 

 

 

 

 

구조체를 한꺼번에 할당을 하고 그데이터를 넘길떄는 포인터로 넘깁니다.


test는 0인지 아닌지를 검사한다.
0아니라면 0040106을 실행하고
0이면 00401081 로 점프를 합니다 


 

 

0이 아니라면 밑에가 진행이된다.

댓글()