티스토리 뷰

정보보호

7/20 과제

ljy98 2021. 7. 21. 08:47

0. 분기 명령어

1. IF.exe 명령어 의미 해석 및 C언어 복구

2. IF_hard.exe 명령어 의미 해석 및 정답(숫자) 찾기


0. 분기 명령어

명령 조건 설명
JE / JZ ZF = 1 결과가 0이면 점프
JNE / JNZ ZF = 0 결과가 0이 아니면 점프
JG ZF = 0 AND SF = OF (부호 있는) 결과가 크면 점프
JGE SF = OF (부호 있는) 결과가 크거나 같으면 점프
JL SF != OF (부호 있는) 결과가 작으면 점프
JLE ZF = 1 OR SF !=OF (부호 있는) 결과가 작거나 같으면 점프
JA CF = 0 AND ZF = 0 (부호 없는) 결과가 크면 점프
JAE CF = 0 (부호 없는) 결과가 크거나 같으면 점프
JB CF = 1 (부호 없는) 결과가 작으면 점프
JBE CF = 1 OF ZF = 1 (부호 없는) 결과가 작거나 같으면 점프
JC / JS / JO / JP CF = 1 / SF = 1 / OF = 1 / PF = 1 CF / SF / OF / PF 가 1이면 점프
JNC / JNS / JNP CF = 0 / SF = 0 / PF = 0 CF / SF / PF 가 0이면 점프

 

 

1. IF.exe 명령어 의미 해석 및 C언어 복구

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

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

013E1080  /$ 55            PUSH EBP              ;  프롤로그 - 스택의 처음 위치 설정
013E1081  |. 8BEC          MOV EBP,ESP              ;  프롤로그 - 스택의 마지막 위치 설정
013E1083  |. 83EC 08       SUB ESP,8
013E1086  |. A1 50303E01   MOV EAX,DWORD PTR DS:[13E3050>           ;  카나리 (메모리 보호기법)
013E108B  |. 33C5          XOR EAX,EBP            ;  카나리
013E108D  |. 8945 FC       MOV DWORD PTR SS:[EBP-4],EAX            ;  카나리
013E1090  |. 68 00303E01   PUSH if.013E3000              ;  "숫자를 입력하시오 : "를 스택에 저장
013E1095  |. E8 46000000   CALL if.013E10E0              ;  printf 함수 호출
013E109A  |. 83C4 04       ADD ESP,4
013E109D  |. 8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]
013E10A0  |. 50            PUSH EAX                     
013E10A1  |. 68 18303E01   PUSH if.013E3018              ;  "%d"를 스택에 저장 
013E10A6  |. E8 75000000   CALL if.013E1120              ;  scanf 함수 호출
013E10AB  |. 83C4 08       ADD ESP,8
013E10AE  |. 837D F8 63    CMP DWORD PTR SS:[EBP-8],63              ;  [EBP-8]의 주소 값에서 99를 빼는 연산
013E10B2  |. 7E 0D         JLE SHORT if.013E10C1              ;  결과가 작거나 같으면 return 0;로 점프
013E10B4  |. 68 1C303E01   PUSH if.013E301C              ;  "입력하신 숫자의 자리수는 세자리 이상입니다.\n"를 스택에 저장
013E10B9  |. E8 22000000   CALL if.013E10E0              ;  printf 함수 호출
013E10BE  |. 83C4 04       ADD ESP,4
013E10C1  |> 33C0          XOR EAX,EAX                ;  return 0;
013E10C3  |. 8B4D FC       MOV ECX,DWORD PTR SS:[EBP-4]             ;  카나리 (메모리 보호기법)
013E10C6  |. 33CD          XOR ECX,EBP              ;  카나리
013E10C8  |. E8 8E000000   CALL if.013E115B              ;  카나리
013E10CD  |. 8BE5          MOV ESP,EBP           ;  에필로그
013E10CF  |. 5D            POP EBP            ;  에필로그 - 스택의 처음 위치 해제
013E10D0  \. C3            RETN            ;  에필로그 - 함수를 호출한 지점으로 돌아감 (종료)

 

[그림 3] if.exe의 C언어 코드

 

 

2. IF_hard.exe 명령어 의미 해석 및 정답(숫자) 찾기

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

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

00C41080  /$ 55           PUSH EBP              ;  프롤로그 - 스택의 처음 위치 설정
00C41081  |. 8BEC         MOV EBP,ESP             ;  프롤로그 - 스택의 마지막 위치 설정
00C41083  |. 83EC 08      SUB ESP,8
00C41086  |. A1 0430C400  MOV EAX,DWORD PTR DS:[C43004]             ;  카나리 (메모리 보호기법)
00C4108B  |. 33C5         XOR EAX,EBP              ;  카나리
00C4108D  |. 8945 FC      MOV DWORD PTR SS:[EBP-4],EAX               ;  카나리 
00C41090  |. 68 F020C400  PUSH If_hard.00C420F0            ;  "숫자를 입력하시오(1~1000) : "를 스택에 저장
00C41095  |. E8 E6000000  CALL If_hard.00C41180            ;  printf 함수 호출
00C4109A  |. 83C4 04      ADD ESP,4
00C4109D  |. 8D45 F8      LEA EAX,DWORD PTR SS:[EBP-8]
00C410A0  |. 50           PUSH EAX                         ; /Arg2
00C410A1  |. 68 1021C400  PUSH If_hard.00C42110            ;  "%d"를 스택에 저장 
00C410A6  |. E8 15010000  CALL If_hard.00C411C0            ;  scanf 함수 호출 
00C410AB  |. 83C4 08      ADD ESP,8
00C410AE  |. 837D F8 0A   CMP DWORD PTR SS:[EBP-8],0A             ;  [EBP-8]과 10 대소비교
00C410B2  |. 7F 12        JG SHORT If_hard.00C410C6             ;  [EBP-8]이 더 크면 912와 비교하는 곳으로 점프
00C410B4  |. 68 1421C400  PUSH If_hard.00C42114            ;  "Not here~\n"를 스택에 저장
00C410B9  |. E8 C2000000  CALL If_hard.00C41180            ;  printf 함수 호출
00C410BE  |. 83C4 04      ADD ESP,4
00C410C1  |. E9 A0000000  JMP If_hard.00C41166             ;  조건없이 return 0;로 점프
00C410C6  |> 817D F8 9003>CMP DWORD PTR SS:[EBP-8],390             ;  [EBP-8]과 912 대소비교
00C410CD  |. 7C 12        JL SHORT If_hard.00C410E1            ;  [EBP-8]이 더 작으면 200과 비교하는 곳으로 점프
00C410CF  |. 68 2021C400  PUSH If_hard.00C42120            ; "no no\n"를 스택에 저장
00C410D4  |. E8 A7000000  CALL If_hard.00C41180            ;  printf 함수 호출
00C410D9  |. 83C4 04      ADD ESP,4
00C410DC  |. E9 85000000  JMP If_hard.00C41166             ;  조건없이 return 0;로 점프
00C410E1  |> 817D F8 C800>CMP DWORD PTR SS:[EBP-8],0C8             ;  [EBP-8]과 200 대소비교
00C410E8  |. 75 0F        JNZ SHORT If_hard.00C410F9            ;  [EBP-8]이 200과 같지 않으면 250과 비교하는 곳으로 점프
00C410EA  |. 68 2821C400  PUSH If_hard.00C42128            ;  "try again\n"를 스택에 저장
00C410EF  |. E8 8C000000  CALL If_hard.00C41180            ;  printf 함수 호출
00C410F4  |. 83C4 04      ADD ESP,4
00C410F7  |. EB 6D        JMP SHORT If_hard.00C41166              ;  조건없이 return 0;로 점프
00C410F9  |> 817D F8 FA00>CMP DWORD PTR SS:[EBP-8],0FA             ;  [EBP-8]과 250 대소비교
00C41100  |. 7E 57        JLE SHORT If_hard.00C41159              ;  [EBP-8]이 더 작거나 같으면 "more harder/n"으로 점프
00C41102  |. 817D F8 C702>CMP DWORD PTR SS:[EBP-8],2C7              ;  [EBP-8]과 711 대소비교
00C41109  |. 7E 0F        JLE SHORT If_hard.00C4111A             ;  [EBP-8]이 더 작거나 같으면 573과 비교하는 곳으로 점프
00C4110B  |. 68 3421C400  PUSH If_hard.00C42134            ;  "nop!\n"을 스택에 저장
00C41110  |. E8 6B000000  CALL If_hard.00C41180            ;  printf 함수 호출
00C41115  |. 83C4 04      ADD ESP,4
00C41118  |. EB 3D        JMP SHORT If_hard.00C41157              ;  조건없이 return 0;로 점프
00C4111A  |> 817D F8 3D02>CMP DWORD PTR SS:[EBP-8],23D            ;  [EBP-8]과 573 대소비교
00C41121  |. 7F 0F        JG SHORT If_hard.00C41132             ;  [EBP-8]이 더 크면 575와 비교하는 곳으로 점프
00C41123  |. 68 3C21C400  PUSH If_hard.00C4213C            ;  "you missed it\n"을 스택에 저장
00C41128  |. E8 53000000  CALL If_hard.00C41180            ;  printf 함수 호출
00C4112D  |. 83C4 04      ADD ESP,4
00C41130  |. EB 25        JMP SHORT If_hard.00C41157             ;  조건없이 return 0;로 점프
00C41132  |> 817D F8 3F02>CMP DWORD PTR SS:[EBP-8],23F             ; [EBP-8]과 575 대소비교
00C41139  |. 7C 0F        JL SHORT If_hard.00C4114A             ;  [EBP-8]이 더 작으면 "oh how can find?\n"으로 점프
00C4113B  |. 68 4C21C400  PUSH If_hard.00C4214C            ;  "almost there\n"을 스택에 저장
00C41140  |. E8 3B000000  CALL If_hard.00C41180            ;  printf 함수 호출
00C41145  |. 83C4 04      ADD ESP,4
00C41148  |. EB 0D        JMP SHORT If_hard.00C41157            ;  조건없이 return 0;로 점프
00C4114A  |> 68 5C21C400  PUSH If_hard.00C4215C            ;  "oh how can find?\n"를 스택에 저장
00C4114F  |. E8 2C000000  CALL If_hard.00C41180            ;  printf 함수 호출
00C41154  |. 83C4 04      ADD ESP,4
00C41157  |> EB 0D        JMP SHORT If_hard.00C41166            ;  조건없이 return 0;로 점프
00C41159  |> 68 7021C400  PUSH If_hard.00C42170            ;  "more harder\n"을 스택에 저장 
00C4115E  |. E8 1D000000  CALL If_hard.00C41180            ;  printf 함수 호출
00C41163  |. 83C4 04      ADD ESP,4
00C41166  |> 33C0         XOR EAX,EAX               ;  return 0;
00C41168  |. 8B4D FC      MOV ECX,DWORD PTR SS:[EBP-4]              ;  카나리 (메모리 보호기법)
00C4116B  |. 33CD         XOR ECX,EBP              ;  카나리
00C4116D  |. E8 89000000  CALL If_hard.00C411FB               ;  카나리 
00C41172  |. 8BE5         MOV ESP,EBP              ;  에필로그
00C41174  |. 5D           POP EBP              ;  에필로그 - 스택의 처음 위치 해제
00C41175  \. C3           RETN               ;  에필로그 - 함수를 호출한 지점으로 돌아감 (종료)

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

7/22 과제  (0) 2021.07.23
7/22 수업  (0) 2021.07.22
7/21 과제  (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
글 보관함