C300_019
C300_소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <stdio.h> main() { int x = 4; int y = 2; int z; z = x + y; // 6 = 4 + 2 z = x - y; // 2 = 4 - 2 z = x * y; // 8 = 4 * 2 z = x / y; // 2 = 4 / 2 z = (x+y) * (x-y); // 12 = (4+2) * (4-2) z = (x*y) + (x/y); // 16 = (4*2) + (4/2) z = x + y + 2004; // 2010 = 4 + 2 + 2004 z = 2004 - x - y; // 1998 = 2004 - 4 - 2 } | cs |
IDA - Layout Graph
IDA - Text View
imul
- 음수를 포함한 수를 곱할 때 사용하는 명령어
- eax와의 연산만이 아닌 레지스터끼리 곱, eax가 아닌 다른 레지스터와 메모리 곱, 상수와의 곱이 가능하다.
- 부호 있는 al, ax, eax의 값을 피연산자와 곱한다.
idiv
- 음수를 포함한 수를 나눌 때 필요한 명령어
- 아래 표는 intel 문서를 참고한 것으로 나눌 수는 레지스터에, 나눌 수는 eax에 저장하고 idiv를 실행하면
일반적으로 eax에 몫, edx에 나머지가 저장된다.
cdq(Convert Dword to Qword): dword 크기를 qword 크기로 확장한다.
lea
- lea operand1 operand2 형식으로 사용된다.
- operand2의 주소를 oeprand1에 저장한다.
ex) lea eax [ebp - 4]
: eax에 ebp - 4가 저장될 것이다.
pseudo code - 의사코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include <stdio.h> main() { int x = 4; int y = 2; int z; x = 4; y = 2; eax = x; eax = eax + y; z = eax; ecx = x; ecx = ecx - y; z = ecx; edx = x; edx = edx * y; z = edx; eax = x/y; z = eax; eax = x; eax = eax + y; ecx = x; ecx = ecx - y; eax = eax * ecx; z = eax; ecx = x; ecx = ecx * y; eax = x; eax = x / y; ecx = ecx + y; z = ecx; edx = y; eax = x; ecx = eax + edx + 2004; z = ecx; edx = 2004; edx = edx - x; edx = edx - y; z = edx; eax = 0 } | cs |
pseudo code - 최종 의사 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <stdio.h> main() { int x = 4; int y = 2; int z; x = 4; y = 2; z = x + y; z = x - y; z = x * y; z = x / y; z = (x + y) * (x - y): z = (x * y) + (x / y); z = x + y + 2004; z = 2004 - x - y; } | cs |
'Reversing > ASM to C' 카테고리의 다른 글
ASM to C with IDA - 021 (0) | 2018.05.30 |
---|---|
ASM to C with IDA - 020 (0) | 2018.05.30 |
ASM to C with IDA - 018 (0) | 2018.05.29 |
ASM to C with IDA - 017 (0) | 2018.05.29 |
ASM to C with IDA - 016 (0) | 2018.05.28 |