티스토리 뷰

정보보호

7/21 과제

ljy98 2021. 7. 21. 15:53

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

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

3. while.exe 해석 및 코드 복원

4. for.exe 해석 및 코드 복원


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

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

[ 명령어의 의미 - Switch.exe ]

01321040  /$ 55           PUSH EBP           ;  프롤로그 - 스택의 처음 위치 설정
01321041  |. 8BEC         MOV EBP,ESP          ;  프롤로그 - 스택의 마지막 위치 설정
01321043  |. 83EC 08      SUB ESP,8
01321046  |. C745 F8 0100>MOV DWORD PTR SS:[EBP-8],1           ;  [EBP-8]의 주소에 1을 저장
0132104D  |. 8B45 F8      MOV EAX,DWORD PTR SS:[EBP-8]            ;  EAX 에 [EBP-8]의 주소 값을 저장
01321050  |. 8945 FC      MOV DWORD PTR SS:[EBP-4],EAX             ;  [EBP-4]의 주소에 EAX 값을 저장
01321053  |. 837D FC 00   CMP DWORD PTR SS:[EBP-4],0              ;  [EBP-4]와 0 대소비교
01321057  |. 74 0E        JE SHORT Switch.01321067               ;  [EBP-4]가 0과 같으면 "0을 입력했습니다.\n"로 점프
01321059  |. 837D FC 01   CMP DWORD PTR SS:[EBP-4],1              ;  [EBP-4]와 1 대소비교
0132105D  |. 74 17        JE SHORT Switch.01321076               ;  [EBP-4]가 1과 같으면 "1을 입력했습니다.\n"로 점프
0132105F  |. 837D FC 02   CMP DWORD PTR SS:[EBP-4],2              ;  [EBP-4]와 2 대소비교
01321063  |. 74 20        JE SHORT Switch.01321085                ;  [EBP-4]가 2와 같으면 "2를 입력했습니다.\n"로 점프
01321065  |. EB 2D        JMP SHORT Switch.01321094               ;  조건없이 "해당사항 없음\n"으로 점프
01321067  |> 68 F0203201  PUSH Switch.013220F0             ;  "0을 입력했습니다.\n"를 스택에 저장 
0132106C  |. E8 3F000000  CALL Switch.013210B0             ;  printf 함수 호출
01321071  |. 83C4 04      ADD ESP,4
01321074  |. EB 2B        JMP SHORT Switch.013210A1            ;  조건없이 return 0;로 점프 (break;에 해당)
01321076  |> 68 04213201  PUSH Switch.01322104             ;  "1을 입력했습니다.\n"를 스택에 저장
0132107B  |. E8 30000000  CALL Switch.013210B0             ;  printf 함수 호출
01321080  |. 83C4 04      ADD ESP,4
01321083  |. EB 1C        JMP SHORT Switch.013210A1            ;  조건없이 return 0;로 점프 (break;에 해당)
01321085  |> 68 18213201  PUSH Switch.01322118             ;  "2를 입력했습니다.\n"를 스택에 저장
0132108A  |. E8 21000000  CALL Switch.013210B0             ;  printf 함수 호출 
0132108F  |. 83C4 04      ADD ESP,4
01321092  |. EB 0D        JMP SHORT Switch.013210A1            ;  조건없이 return 0;로 점프 (break;에 해당)
01321094  |> 68 2C213201  PUSH Switch.0132212C             ;  "해당사항 없음\n"을 스택에 저장
01321099  |. E8 12000000  CALL Switch.013210B0             ;  printf 함수 호출
0132109E  |. 83C4 04      ADD ESP,4
013210A1  |> 33C0         XOR EAX,EAX            ;  return 0;
013210A3  |. 8BE5         MOV ESP,EBP            ;  에필로그
013210A5  |. 5D           POP EBP            ;  에필로그 - 스택의 처음 위치 해제
013210A6  \. C3           RETN            ;  에필로그 - 함수를 호출한 지점으로 돌아감 (종료)

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

[EBP-8]을 num으로, [EBP-4]을 num2로 변수를 선언하여 코드로 복원했다.

 

 

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

[그림 4] Switch2.exe를 cmd에 실행했을 때 모습
[그림 5] Switch2.exe의 main 함수

[ 명령어의 의미 - Switch2.exe ]

011B1040  /$ 55           PUSH EBP             ;  프롤로그 - 스택의 처음 위치 설정
011B1041  |. 8BEC         MOV EBP,ESP            ;  프롤로그 - 스택의 마지막 위치 설정
011B1043  |. 83EC 08      SUB ESP,8
011B1046  |. C745 F8 0100>MOV DWORD PTR SS:[EBP-8],1             ;  [EBP-8]의 주소에 1을 저장
011B104D  |. 8B45 F8      MOV EAX,DWORD PTR SS:[EBP-8]              ;  EAX 에 [EBP-8]의 주소 값을 저장
011B1050  |. 8945 FC      MOV DWORD PTR SS:[EBP-4],EAX              ;  [EBP-4]의 주소에 EAX의 값을 저장
011B1053  |. 837D FC 03   CMP DWORD PTR SS:[EBP-4],3             ;  [EBP-4]와 3 대소비교
011B1057  |. 77 46        JA SHORT Switch2.011B109F              ;  [EBP-4]가 3보다 크면 "해당사항 없음\n"으로 점프
011B1059  |. 8B4D FC      MOV ECX,DWORD PTR SS:[EBP-4]
011B105C  |. FF248D B4101>JMP DWORD PTR DS:[ECX*4+11B10B4]           ;  조건없이 [ECX*4+11B10B4]로 점프
011B1063  |> 68 00301B01  PUSH Switch2.011B3000            ;  "0을 입력했습니다.\n"를 스택에 저장
011B1068  |. E8 63000000  CALL Switch2.011B10D0            ;  printf 함수 호출
011B106D  |. 83C4 04      ADD ESP,4
011B1070  |. EB 3A        JMP SHORT Switch2.011B10AC           ;  조건없이 return 0;로 점프 (break;에 해당)
011B1072  |> 68 14301B01  PUSH Switch2.011B3014            ;  "1을 입력했습니다.\n"를 스택에 저장
011B1077  |. E8 54000000  CALL Switch2.011B10D0            ;  printf 함수 호출
011B107C  |. 83C4 04      ADD ESP,4
011B107F  |. EB 2B        JMP SHORT Switch2.011B10AC           ;  조건없이 return 0;로 점프 (break;에 해당)
011B1081  |> 68 28301B01  PUSH Switch2.011B3028            ;  "2를 입력했습니다.\n"를 스택에 저장 
011B1086  |. E8 45000000  CALL Switch2.011B10D0            ;  printf 함수 호출
011B108B  |. 83C4 04      ADD ESP,4
011B108E  |. EB 1C        JMP SHORT Switch2.011B10AC           ;  조건없이 return 0;로 점프 (break;에 해당)
011B1090  |> 68 3C301B01  PUSH Switch2.011B303C            ;  "3을 입력했습니다.\n"를 스택에 저장
011B1095  |. E8 36000000  CALL Switch2.011B10D0            ;  printf 함수 호출
011B109A  |. 83C4 04      ADD ESP,4
011B109D  |. EB 0D        JMP SHORT Switch2.011B10AC            ;  조건없이 return 0;로 점프 (break;에 해당)
011B109F  |> 68 50301B01  PUSH Switch2.011B3050            ;  "해당사항 없음\n"을 스택에 저장 
011B10A4  |. E8 27000000  CALL Switch2.011B10D0            ;  printf 함수 호출
011B10A9  |. 83C4 04      ADD ESP,4
011B10AC  |> 33C0         XOR EAX,EAX            ;  return 0;
011B10AE  |. 8BE5         MOV ESP,EBP            ;  에필로그
011B10B0  |. 5D           POP EBP             ;  에필로그 - 스택의 처음 위치 해제
011B10B1  \. C3           RETN              ;  에필로그 - 함수를 호출한 지점으로 돌아감 (종료)

Switch.exe와 Switch2.exe는 둘다 "1을 입력했습니다."가 출력되는 프로그램이다. Switch2.exe가 Switch.exe와 다른 점은 switch table을 생성한다는 것과 조건이 하나 더 추가되었다는 점이다.

 

[그림 6] Switch2.exe 코드 복원

 

Q. if문과 switch문은 유사해 보인다. 그렇다면 if문을 쓸지 switch문을 쓸지 고민될 때 아무거나 써도 될까?

대체로 그렇다. 하지만 둘 사이의 차이점은 존재한다. 조건이 3개 이하일 때에는 if문을 쓰는 것이 더 낫고, 조건이 4개 이상일 때에는 switch문을 쓰는 것이 더 낫다. 그 이유는 if문은 branch statement 기반이고, switch문은 jump statement 기반이기 때문이다. 쉽게 설명하자면, if문은 조건이 많아질수록 논리값이 참인지 거짓인지를 계속 판단해야 하기 때문에 효율성이 떨어진다. switch문의 경우 조건이 여러 개가 있어도 그 중 들어맞는 조건으로 jump하면 되므로 조건의 갯수가 실행 속도에 크게 영향을 미치지 않는다. 하지만 switch문은 초기에 switch table 생성 시 오버헤드가 발생하기 때문에 조건이 적을 때에는 if문보다 비효율적이다. 그리고, 모든 switch문은 if문으로 대체 가능하지만, 모든 if문이 switch문으로 대체될 수는 없다. (switch문 ⊂ if문)

* 오버헤드(Overhead) : 컴퓨터가 유저 프로그램을 실행할 때 직접 유저 프로그램처리를 하지 않는 부분

 

 

3. while.exe 해석 및 코드 복원

[그림 7] while.exe를 cmd에 실행했을 때 모습
[그림 8] while.exe의 main 함수

[ 명령어의 의미 - while.exe ]

00091040  /$ 55           PUSH EBP           ;  프롤로그 - 스택의 처음 위치 설정
00091041  |. 8BEC         MOV EBP,ESP          ;  프롤로그 - 스택의 마지막 위치 설정
00091043  |. 83EC 08      SUB ESP,8 
00091046  |. C745 FC 0100>MOV DWORD PTR SS:[EBP-4],1           ;  [EBP-4]의 주소에 1을 저장     (초기값)
0009104D  |. C745 F8 0000>MOV DWORD PTR SS:[EBP-8],0            ;  [EBP-8]의 주소에 0을 저장
00091054  |> 837D FC 0A   /CMP DWORD PTR SS:[EBP-4],0A           ;  [EBP-4]와 10 대소비교       (조건문)
00091058  |. 7D 14        |JGE SHORT while.0009106E             ;  [EBP-4]가 10 이상일 때 while문 밖으로 점프       (조건문)
0009105A  |. 8B45 F8      |MOV EAX,DWORD PTR SS:[EBP-8]             ;  EAX 에 [EBP-8]의 주소 값 저장      ;  [EBP-8] 변화
0009105D  |. 0345 FC      |ADD EAX,DWORD PTR SS:[EBP-4]             ;  EAX에 [EBP-4]의 주소 값을 더하는 연산      ;  [EBP-8] 변화
00091060  |. 8945 F8      |MOV DWORD PTR SS:[EBP-8],EAX              ;  [EBP-8]의 주소 값에 EAX 값 저장      ;  [EBP-8] 변화
00091063  |. 8B4D FC      |MOV ECX,DWORD PTR SS:[EBP-4]             ;  ECX에 [EBP-4]의 주소 값 저장      ;  [EBP-4] 변화
00091066  |. 83C1 01      |ADD ECX,1             ;  ECX에 1을 더하는 연산        ;  [EBP-4] 변화       (변화조건)
00091069  |. 894D FC      |MOV DWORD PTR SS:[EBP-4],ECX              ;  [EBP-4]의 주소에 ECX 값 저장      ;  [EBP-4] 변화
0009106C  |.^EB E6        \JMP SHORT while.00091054             ;  조건없이 '조건문'으로 점프
0009106E  |> 8B55 F8      MOV EDX,DWORD PTR SS:[EBP-8]
00091071  |. 52           PUSH EDX                         
00091072  |. 68 00300900  PUSH while.00093000              ;  "%d "를 스택에 저장 
00091077  |. E8 14000000  CALL while.00091090              ;  printf 함수 호출
0009107C  |. 83C4 08      ADD ESP,8
0009107F  |. 33C0         XOR EAX,EAX            ;  return 0;
00091081  |. 8BE5         MOV ESP,EBP            ;  에필로그
00091083  |. 5D           POP EBP            ;  에필로그 - 스택의 처음 위치 해제
00091084  \. C3           RETN             ;  에필로그 - 함수를 호출한 지점으로 돌아감 (종료)

 

while.exe의 반복문에서 [EBP-4]는 반복 횟수이고, [EBP-8]은 더하기 연산을 반복해준 결과 값을 나타낸다.

※ 유한 횟수 만큼 반복되는 반복문은 항상 초기값, 조건문, 변화조건이 필요하다.

 

[그림 9] while.exe 코드 복원

[EBP-4]를 loop로, [EBP-8]을 result로 변수를 설정하여 [그림 9]과 같이 코드를 복원할 수 있다. while.exe는 1부터 9까지의 숫자들의 합을 구하는 프로그램이다.

 

 

4. for.exe 해석 및 코드 복원

[그림 10] for.exe를 cmd에 실행했을 때 모습
[그림 11] for.exe의 main 함수

[ 명령어의 의미 - for.exe ]

00021080  /$ 55           PUSH EBP              ;  프롤로그 - 스택의 처음 위치 설정
00021081  |. 8BEC         MOV EBP,ESP             ;  프롤로그 - 스택의 마지막 위치 설정
00021083  |. 83EC 0C      SUB ESP,0C
00021086  |. A1 30300200  MOV EAX,DWORD PTR DS:[23030]              ;  카나리 (메모리 보호기법)
0002108B  |. 33C5         XOR EAX,EBP               ;  카나리
0002108D  |. 8945 FC      MOV DWORD PTR SS:[EBP-4],EAX             ;  카나리 
00021090  |. 68 00300200  PUSH for.00023000                ;  "숫자를 입력하시오 : "를 스택에 저장
00021095  |. E8 66000000  CALL for.00021100                ;  printf 함수 호출
0002109A  |. 83C4 04      ADD ESP,4
0002109D  |. 8D45 F8      LEA EAX,DWORD PTR SS:[EBP-8]
000210A0  |. 50           PUSH EAX                         ; /Arg2
000210A1  |. 68 18300200  PUSH for.00023018                ;  "%d"를 스택에 저장
000210A6  |. E8 95000000  CALL for.00021140                ;  scanf 함수 호출
000210AB  |. 83C4 08      ADD ESP,8
000210AE  |. C745 F4 0100>MOV DWORD PTR SS:[EBP-C],1              ;  [EBP-C]의 주소에 1을 저장        (초기값)
000210B5  |. EB 09        JMP SHORT for.000210C0              ;  조건없이 '조건문'으로 점프
000210B7  |> 8B4D F4      /MOV ECX,DWORD PTR SS:[EBP-C]              ;  ECX에 [EBP-C]의 주소 값 저장       ;  [EBP-C] 변화
000210BA  |. 83C1 01      |ADD ECX,1              ;  ECX에 1을 더하는 연산        ;  [EBP-C] 변화        (변화조건)
000210BD  |. 894D F4      |MOV DWORD PTR SS:[EBP-C],ECX              ;  [EBP-C]의 주소에 ECX 값을 저장       ;  [EBP-C] 변화
000210C0  |> 837D F4 0A    CMP DWORD PTR SS:[EBP-C],0A             ;  [EBP-C]와 10 대소비교       (조건문)
000210C4  |. 7D 1F        |JGE SHORT for.000210E5              ;  [EBP-C]가 10 이상일 때 return 0;로 점프        (조건문)
000210C6  |. 8B55 F8      |MOV EDX,DWORD PTR SS:[EBP-8]               ;  EDX에 [EBP-8]의 주소 값을 저장
000210C9  |. 0FAF55 F4    |IMUL EDX,DWORD PTR SS:[EBP-C]             ;  EDX에 [EBP-C]의 주소 값을 곱하는 연산
000210CD  |. 52           |PUSH EDX                        ;  네 번째 변수에 해당 (num * loop) ← [EBP-8] * [EBP-C]
000210CE  |. 8B45 F4      |MOV EAX,DWORD PTR SS:[EBP-C]    ; |
000210D1  |. 50           |PUSH EAX                        ;  세 번째 변수에 해당 (loop) ← [EBP-C]
000210D2  |. 8B4D F8      |MOV ECX,DWORD PTR SS:[EBP-8]    ; |
000210D5  |. 51           |PUSH ECX                        ;  두 번째 변수에 해당 (num) ← [EBP-8]
000210D6  |. 68 1C300200  |PUSH for.0002301C               ;  "%d * %d = %d\n"를 스택에 저장
000210DB  |. E8 20000000  |CALL for.00021100               ;  printf 함수 호출
000210E0  |. 83C4 10      |ADD ESP,10
000210E3  |.^EB D2        \JMP SHORT for.000210B7             ;  조건없이 for문으로 점프
000210E5  |> 33C0         XOR EAX,EAX               ;  return 0;
000210E7  |. 8B4D FC      MOV ECX,DWORD PTR SS:[EBP-4]              ;  카나리 (메모리 보호기법)
000210EA  |. 33CD         XOR ECX,EBP              ;  카나리
000210EC  |. E8 8A000000  CALL for.0002117B               ;  카나리
000210F1  |. 8BE5         MOV ESP,EBP              ;  에필로그
000210F3  |. 5D           POP EBP            ;  에필로그 - 스택의 처음 위치 해제
000210F4  \. C3           RETN             ;  에필로그 - 함수를 호출한 지점으로 돌아감 (종료)

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

[EBP-8]을 num으로, [EBP-C]를 loop로 변수를 설정하여 코드를 복원했다.

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

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