Reverse Engineering-008(반복문)
반복문
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);
}
loop()함수의 시작이 0x401080으로 시작하는 것을 확인 했다
그리고 sub esp, 8을 통해 int 형 변수 2개로 추측하고 0x401086, 0x40108D를 통해 INT형 변수 2개가 선언된 것을 확인했다 (DWROD [ebp-4], DWORD [ebp-8]이므로 4byte 지역 변수 2개 선언)
그리고 바로 0x40109F로 점프하는 것을 확인
0x40109F에서 cmp + 점프문이 나온것으로 봐서 조건문인 것을 알 수 있다
ebp-8 > 100일 경우 0x4010C4로 점프하고 아닐경우 0x4010A8를 실행한다
0x4010A8부터 ebp-4를 printf문으로 출력하고 ebp-4에 1을 더하고 0x401096으로 점프하는 것을 확인
0x401096으로 가서 ebp-8에 1을 더하고 다시 비교하는 것을 확인
이것을 통해 0x401094부터 0x4010C2가 for문이라는 것을 알 수 있다
---> for (i = 0; i < 0x100; i++)
만약 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문이라는 것을 알 수 있다!!!