리버싱 기초 - c 문법과 어셈블리어
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이 아니라면 밑에가 진행이된다.
'악성코드 및 포렌식' 카테고리의 다른 글
올리디버거 레나 듀토리얼 -1 (0) | 2021.03.06 |
---|---|
올리디버거 (0) | 2021.03.06 |
리버싱 기초 -함수 호출 규약 (0) | 2021.03.06 |
리버싱 기초 -어셈블리 명령어와 함수 호출 구조 (0) | 2021.03.05 |
리버싱 기초 (0) | 2021.03.04 |