강의정리/Z0FCourse_Re

[x86-64] 루프 (반복문), 디컴파일러의 do-while 루프

우와해커 2020. 1. 22. 15:14

Z0FCourse_ReverseEngineering/Chapter 5 - BasicReversing/5.4 Loops.md

For Loop 

- While 루프 역시 형태가 비슷합니다.

 

MOV EDX, EBX
LEA RCX, QWROD PTR DS:[0x7FF7A85A9D90]     ; const char* format = "INDEX= %D\n"
CALL <testing.printf>					   ; printf
INC EBX
CMP EBX, 0XA							   ; A:'\n'
JL testing.7FF7A8591080

 

루프를 식별하는 가장 빠른 방법은 인덱스 / 반복 카운터를 찾는 것입니다.
위의 예에서 우리는 EBX가 XOR EBX, EBX로 제로화되고 있음을 알 수 있습니다.
이것은 특별한 것은 아니지만 조금 내려 가면 INC EBX로 EBX가 증가하고 있음을 알 수 있습니다.
x64dbg는 또한 가능한 루프를 암시하는 화살표 (예 : 맨 왼쪽의 주황색 화살표)를 사용합니다.
자, 충분히 훓어 봤으면 루프를 실제로 살펴 봅시다.

 

- 첫 번째 EBX가 0입니다. 우리는 이제이 루프가 0의 루프로 시작한다는 것을 알고 있습니다.

  EBX를 루프 인덱스라고합니다.
- EDX는 루프 인덱스로 설정됩니다.
- 문자열이 RCX로 이동됩니다. printf ()가 호출됩니다.

  RCX (printf ()에 전달 된 첫 번째 매개 변수는 "Index : % d \ n"문자열을 포함합니다.
- EDX (printf ()에 전달 된 두 번째 매개 변수)는 루프 색인을 포함합니다.
- printf () 호출은 다음과 유사하다고 가정 할 수 있습니다. printf ( "색인 : % d \ n", 색인);
- 그런 다음 루프 인덱스는 1 씩 증가합니다.
- 인덱스는 10 (0xA)과 비교됩니다.
- 인덱스가 10보다 작 으면 루프를 반복합니다. 루프의 시작은 MOV EDX, EBX입니다.

 

 

따라서이 루프는 "Index : % d \ n"을 10 번 인쇄합니다. C/C ++로 작성된 모습은 다음과 같습니다.

for (int i = 0; i < 10; i++) {
printf("Index: %d\n", i);
}

Do-While 루프

 

Do-while 루프는 대부분의 개발자가 자주 사용하지는 않지만 컴파일러는 지속적으로 생성합니다.
do-while 루프는 while 루프 내부 코드를 제외하고는 while 루프입니다.
대부분의 개발자는 그렇게 정의하지 않아도 정확하게 이 작업을 수행하는 루프를 만듭니다.
앞서 주어진 while 루프와 for 루프 예제는 do-while 루프로 수행 할 수 있습니다.
성능을 향상시키기 위해 많은 컴파일러는 for 루프 나 while 루프 대신 do-while 루프를 사용합니다.
하나의 비교를 제거하고 루프에서 뛰어 넘을 수 있기 때문입니다.
만약 당신이 디컴파일러를 사용해봤다면 대게 이런 이유로 루프가 do-while 루프로 표시되는 것을 볼 수 있습니다.