개인 공부/리버싱

Reverse Engineering-008(반복문)

Bandit10 2023. 4. 19. 03:02

반복문

002에서 기본 문법으로 for문을 다뤘지만 이번에는 조건이 추가되었을 때 코드가 변하는지 확인해보기!!

  • break문이 들어 갈 경우
  • continue문이 들어갈 경우
  • return문이 들어가는 경우

#include <stdio.h>

int loop(int c) {
	int d = 0;
	for (int i = 0; i <= 0x100; i++) {
		printf("loop :%d\n", d);
		d++;
	}
	return c + d;
}

int main() {
	int lp;
	lp = loop(0x10);
	printf("%d ", lp);
}

x32.dbg

loop()함수의 시작이 0x401080으로 시작하는 것을 확인 했다

그리고 sub esp, 8을 통해 int 형 변수 2개로 추측하고 0x401086, 0x40108D를 통해 INT형 변수 2개가 선언된 것을 확인했다 (DWROD [ebp-4], DWORD [ebp-8]이므로 4byte 지역 변수 2개 선언) 

그리고 바로 0x40109F로 점프하는 것을 확인

loop() 시작

0x40109F에서 cmp + 점프문이 나온것으로 봐서 조건문인 것을 알 수 있다

ebp-8 > 100일 경우 0x4010C4로 점프하고 아닐경우 0x4010A8를 실행한다

0x4010A8부터  ebp-4를 printf문으로 출력하고 ebp-4에 1을 더하고 0x401096으로 점프하는 것을 확인

0x40109F

0x401096으로 가서 ebp-8에 1을 더하고 다시 비교하는 것을 확인

이것을 통해 0x401094부터 0x4010C2가 for문이라는 것을 알 수 있다

---> for (i = 0; i < 0x100; i++)

0x401096

만약 ebp-4가 0x100(256)이 넘을 경우 ebp+8 + ebp-4를 더하고 값을 리턴하는 것을 확인 할 수 있다

ebp+8은 매개변수 C라는 것을 알 수 있고 ebp-4는 지역변수 D라는 것을 알 수있고 

C+D를 리턴하는 것을 확인했다


  • break문이 들어가는 경우

이번에는 위에 코드에 break문을 넣었을 경우 어떻게 변했는지 확인!!

#include <stdio.h>

int loop(int c) {
	int d = 0;
	for (int i = 0; i <= 0x100; i++) {
		if (i == c)	break;
		printf("loop :%d\n", d);
		d++;
	}
	return c + d;
}

int main() {
	int lp;
	lp = loop(0x10);
	printf("%d ", lp);
}

위에 코드와 달라진 부분을 확인 할 수있다

여기서 확인해야 할 부분은 바로 0x4010AE와 0x4010B0을 보면 점프문이 2개가 생긴 것을 확인 할 수있다

0x4010AB에서 ebp-4와 ebp+8을 비교해서 값이 같을 경우 0x4010CE로 점프하고

같지 않을 경우 0x4010B2로 점프하는 것을 확인할 수 있다

0x4010B2를 통해 for문을 빠져 나오는 것을 알 수 있다

결국 점프문이 2개가 연속으로 나오는 패턴은 break문인것을 알 수 있다!!!

 


  • continue가 들어갈 경우

이번에는 위에 코드에 continue문을 넣었을 경우 어떻게 변했는지 확인!!

#include <stdio.h>

int loop(int c) {
	int d = 0;
	for (int i = 0; i <= 0x100; i++) {
		if (i == c)	continue;
		printf("loop :%d\n", d);
		d++;
	}
	return c + d;
}

int main() {
	int lp;
	lp = loop(0x10);
	printf("%d ", lp);
}

break문과 비슷하게 점프문이 2개가 있어 달라진게 없는 것처럼 보이지만

2번째 점프문을 통해 달라진 것을 알 수 있다

0x4010B2의 점프문을 보면 ebp-4와 ebp+8이 값이 같을 경우 ebp-8을 더하지 않고

바로0x401096 for문 처음으로 가서 for문을 다시 돌리는 것을 알 수있다 

그래서 결국 0x401096이 continue문이라는 것을 확인 할 수 있다!!


  • return문이 들어갈 경우

이번에는 위에 코드에 return문을 넣었을 경우 어떻게 변했는지 확인!!

#include <stdio.h>

int loop(int c) {
	int d = 0;
	for (int i = 0; i <= 0x100; i++) {
		if (i == c)	return 0;
		printf("loop :%d\n", d);
		d++;
	}
	return c + d;
}

int main() {
	int lp;
	lp = loop(0x10);
	printf("%d ", lp);
}

이번에 달라진 부분을 크게 보면 점프문 이후 xor로 값을 초기화하고 다시 점프하는 것을 볼 수 있다

ebp-4와 ebp8의 값이 같지 않을 경우 for문을 그대로 진행하는 것을 알 수 있고

ebp-4와 ebp8의 값이 같을 경우 바로 for문을 나오는 것을 볼 수 있다

break문과는 달리 0x4010B0에 xor 명령어가 생긴것을 알 수 있다

어셈블러에서 xor 뒤에 같은 오퍼랜드가 나오면 값을 초기화하는 데, 여기서 값을 초기화하고 for문을 나오는 것을 볼 수 있다

결국 점프문과 xor문 점프문이 나오면 return문이라는 것을 알 수 있다!!! 

 


2023.04.10 - [개인 공부/리버싱] - Reverse Engineering-002(문법)