티스토리 뷰
1. while2.exe 해석 및 코드 복원
2. for2.exe 해석 및 코드 복원
3. for2_patch.exe 만들기
1. while2.exe 해석 및 코드 복원
[ 명령어의 의미 - while2.exe ]
00231080 /$ 55 PUSH EBP ; 프롤로그
00231081 |. 8BEC MOV EBP,ESP ; 프롤로그
00231083 |. 83EC 08 SUB ESP,8
00231086 |. A1 3C302300 MOV EAX,DWORD PTR DS:[23303C] ; 카나리 (메모리 보호기법)
0023108B |. 33C5 XOR EAX,EBP ; 카나리
0023108D |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX ; 카나리
00231090 |> B8 01000000 /MOV EAX,1 ; EAX에 1을 저장 (초기값)
00231095 |. 85C0 |TEST EAX,EAX ; EAX와 EAX를 AND연산 ← 연산값은 항상 1 (조건문)
00231097 |. 74 39 |JE SHORT while2.002310D2 ; 결과가 0이면 return 0;로 점프 (조건문)
00231099 |. 68 00302300 |PUSH while2.00233000 ; "숫자를 입력하시오 : "를 스택에 저장
0023109E |. E8 4D000000 |CALL while2.002310F0 ; printf 함수 호출
002310A3 |. 83C4 04 |ADD ESP,4
002310A6 |. 8D4D F8 |LEA ECX,DWORD PTR SS:[EBP-8]
002310A9 |. 51 |PUSH ECX ; /Arg2
002310AA |. 68 18302300 |PUSH while2.00233018 ; "%d"를 스택에 저장
002310AF |. E8 7C000000 |CALL while2.00231130 ; scanf 함수 호출
002310B4 |. 83C4 08 |ADD ESP,8
002310B7 |. 837D F8 00 |CMP DWORD PTR SS:[EBP-8],0 ; [EBP-8]의 주소 값과 0 대소비교
002310BB |. 7D 02 |JGE SHORT while2.002310BF ; [EBP-8]이 0이상이면 2줄 밑으로 점프
002310BD |. EB 13 |JMP SHORT while2.002310D2 ; 조건없이 return 0;로 점프
002310BF |> 8B55 F8 |MOV EDX,DWORD PTR SS:[EBP-8] ; EDX에 [EBP-8]의 주소 값 저장
002310C2 |. 52 |PUSH EDX ; /Arg2
002310C3 |. 68 1C302300 |PUSH while2.0023301C ; "입력한 숫자는 %d입니다.\n"를 스택에 저장
002310C8 |. E8 23000000 |CALL while2.002310F0 ; printf 함수 호출
002310CD |. 83C4 08 |ADD ESP,8
002310D0 |.^EB BE \JMP SHORT while2.00231090 ; 조건없이 while문으로 점프
002310D2 |> 33C0 XOR EAX,EAX ; return 0;
002310D4 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] ; 카나리 (메모리 보호기법)
002310D7 |. 33CD XOR ECX,EBP ; 카나리
002310D9 |. E8 8D000000 CALL while2.0023116B ; 카나리
002310DE |. 8BE5 MOV ESP,EBP ; 에필로그
002310E0 |. 5D POP EBP ; 에필로그
002310E1 \. C3 RETN ; 에필로그
while2.exe에는 무한히 반복되는 while문이 있다. while문에 초기값, 조건문은 포함되어 있으나 변화조건이 없다. while2.exe 프로그램의 의미는 양수를 입력했을 때에는 그 값을 출력하고, 음수를 입력했을 때에는 중단된다는 것이다.
Q. 무조건 양수를 입력하면 출력되고, 음수를 입력하면 프로그램이 중단될까? No !
[그림 4]에서 보면 알 수 있듯이 예외가 존재한다. 그 이유는 int형인 num 값은 -2147483648 ~ 2147483647 사이의 값만 가질 수 있기 때문이다. 2147483647보다 1이 큰 217483648은 -2147483648로 인식하고, -2147483648보다 1이 작은 -2147483649는 2147483647로 인식한다. 위 범위의 값들이 계속 순환하게 된다.
2. for2.exe 해석 및 코드 복원
[ 명령어의 의미 - for2.exe ]
00EB1040 /$ 55 PUSH EBP ; 프롤로그
00EB1041 |. 8BEC MOV EBP,ESP ; 프롤로그
00EB1043 |. 83EC 08 SUB ESP,8
00EB1046 |. C745 FC 0100>MOV DWORD PTR SS:[EBP-4],1 ; [EBP-4]에 1을 저장 (초기값)
00EB104D |. EB 09 JMP SHORT for2.00EB1058 ; 조건없이 '[EBP-4]와 10 대소비교'로 점프
00EB104F |> 8B45 FC /MOV EAX,DWORD PTR SS:[EBP-4] ; EAX에 [EBP-4]의 주소 값 저장 ; [EBP-4] 변화
00EB1052 |. 83C0 01 |ADD EAX,1 ; EAX에 1을 더하는 연산 ; [EBP-4] 변화 (변화조건)
00EB1055 |. 8945 FC |MOV DWORD PTR SS:[EBP-4],EAX ; [EBP-4]에 EAX 값 저장 ; [EBP-4] 변화
00EB1058 |> 837D FC 0A CMP DWORD PTR SS:[EBP-4],0A ; [EBP-4]와 10 대소비교 (조건문)
00EB105C |. 7F 38 |JG SHORT for2.00EB1096 ; [EBP-4]가 더 크면 return 0;로 점프 (조건문)
00EB105E |. C745 F8 0100>|MOV DWORD PTR SS:[EBP-8],1 ; [EBP-8]에 1을 저장 (초기값)
00EB1065 |. EB 09 |JMP SHORT for2.00EB1070 ; 조건없이 [EBP-8] 변화 이후로 점프
00EB1067 |> 8B4D F8 |/MOV ECX,DWORD PTR SS:[EBP-8] ; ECX에 [EBP-8]의 주소 값 저장 ; [EBP-8] 변화
00EB106A |. 83C1 01 ||ADD ECX,1 ; ECX에 1을 더하는 연산 ; [EBP-8] 변화 (변화조건)
00EB106D |. 894D F8 ||MOV DWORD PTR SS:[EBP-8],ECX ; [EBP-8]에 ECX 값 저장 ; [EBP-8] 변화
00EB1070 |> 8B55 F8 | MOV EDX,DWORD PTR SS:[EBP-8] ; EDX에 [EBP-8]의 주소 값 저장
00EB1073 |. 3B55 FC ||CMP EDX,DWORD PTR SS:[EBP-4] ; EDX와 [EBP-4] 대소비교 (조건문)
00EB1076 |. 7F 0F ||JG SHORT for2.00EB1087 ; EDX가 더 크면 "\n"으로 점프 (조건문)
00EB1078 |. 68 0030EB00 ||PUSH for2.00EB3000 ; "*"을 스택에 저장
00EB107D |. E8 1E000000 ||CALL for2.00EB10A0 ; printf 함수 호출 (EDX가 [EBP-4]와 같아질 때까지 *을 print)
00EB1082 |. 83C4 04 ||ADD ESP,4
00EB1085 |.^EB E0 |\JMP SHORT for2.00EB1067 ; 조건없이 두 번째 for문으로 점프
00EB1087 |> 68 0430EB00 |PUSH for2.00EB3004 ; "\n"을 스택에 저장
00EB108C |. E8 0F000000 |CALL for2.00EB10A0 ; printf 함수 호출
00EB1091 |. 83C4 04 |ADD ESP,4
00EB1094 |.^EB B9 \JMP SHORT for2.00EB104F ; 조건없이 첫 번째 for문으로 점프
00EB1096 |> 33C0 XOR EAX,EAX ; return 0;
00EB1098 |. 8BE5 MOV ESP,EBP ; 에필로그
00EB109A |. 5D POP EBP ; 에필로그
00EB109B \. C3 RETN ; 에필로그
[EBP-4]는 line(\n), [EBP-8]은 star(*)로 변수를 설정해 줄 수 있다.
3. for2_patch.exe 만들기
*가 print되는 모습이 [그림 8]과 같이 (행, *)이 (1,10), (2,9), (3,8), ··· , (10,1)으로 나타나도록 어셈블리어를 바꿔줄 수 있다.
[그림 9]의 방법은 이중 for문 중에서 두 번째 for문의 구조를 바꾸어 준 것이다.
[그림 11]의 방법은 이중 for문 중에서 첫 번째 for문의 구조를 바꾸어 준 것이다.
같은 내용을 출력하는 프로그램의 C언어 코드가 여러 개 존재하듯이 어셈블리어도 마찬가지이다. [그림 9]과 [그림 11]은 모두 *의 갯수를 줄여나가며 [그림 8]과 같이 출력하는 프로그램을 만드는 서로 다른 방법이다.
- Total
- Today
- Yesterday
- c언어
- DOM
- window 객체
- long
- 키워드
- Screen 객체
- Browser Object Model
- int
- location 객체
- 컴파일
- Char
- bom
- keyword
- 변수
- 자료형
- History 객체
- 리액트 #React #props #state #javascript
- gcc
- Document Object Model
- short
- Navigator 객체
- stdio.h
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |