티스토리 뷰

정보보호

7/22 수업

ljy98 2021. 7. 22. 19:41

1. while2.exe 해석 및 코드 복원

2. for2.exe 해석 및 코드 복원

3. for2_patch.exe 만들기


1. while2.exe 해석 및 코드 복원

[그림 1] while2.exe를 cmd로 실행했을 때 모습
[그림 2] while2.exe의 main 함수

[ 명령어의 의미 - 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 프로그램의 의미는 양수를 입력했을 때에는 그 값을 출력하고, 음수를 입력했을 때에는 중단된다는 것이다.

 

[그림 3] while2.exe 코드 복원

 

Q. 무조건 양수를 입력하면 출력되고, 음수를 입력하면 프로그램이 중단될까?  No !

[그림 4] while2.exe의 특이한 점

[그림 4]에서 보면 알 수 있듯이 예외가 존재한다. 그 이유는 int형인 num 값은 -2147483648 ~ 2147483647 사이의 값만 가질 수 있기 때문이다. 2147483647보다 1이 큰 217483648은 -2147483648로 인식하고, -2147483648보다 1이 작은 -2147483649는 2147483647로 인식한다. 위 범위의 값들이 계속 순환하게 된다.

 

 

2. for2.exe 해석 및 코드 복원

[그림 5] for2.exe를 cmd로 실행했을 때 모습
[그림 6] for2.exe의 main 함수

[ 명령어의 의미 - 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            ;  에필로그

 

[그림 7] for2.exe 코드 복원

[EBP-4]는 line(\n), [EBP-8]은 star(*)로 변수를 설정해 줄 수 있다.

 

 

3. for2_patch.exe 만들기

[그림 8] for2_patch.exe를 실행했을 때 모습

*가 print되는 모습이 [그림 8]과 같이 (행, *)이 (1,10), (2,9), (3,8), ··· , (10,1)으로 나타나도록 어셈블리어를 바꿔줄 수 있다.

 

[그림 9] for2_patch.exe의 main 함수

[그림 9]의 방법은 이중 for문 중에서 두 번째 for문의 구조를 바꾸어 준 것이다.

 

[그림 10] for2_patch.exe 코드 복원

 

[그림 11] for2_patch2.exe의 main 함수

[그림 11]의 방법은 이중 for문 중에서 첫 번째 for문의 구조를 바꾸어 준 것이다.

 

[그림 12] for2_patch2.exe 코드 복원

같은 내용을 출력하는 프로그램의 C언어 코드가 여러 개 존재하듯이 어셈블리어도 마찬가지이다. [그림 9]과 [그림 11]은 모두 *의 갯수를 줄여나가며 [그림 8]과 같이 출력하는 프로그램을 만드는 서로 다른 방법이다.

'정보보호' 카테고리의 다른 글

7/23 수업  (0) 2021.07.24
7/22 과제  (0) 2021.07.23
7/21 과제  (0) 2021.07.21
7/20 과제  (0) 2021.07.21
7/19 과제  (0) 2021.07.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
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
글 보관함