336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
1. 리버싱 소개
3) 나머지 명령어
▣ CALL
- EIP 값을 바꿈. (함수호출)
- JUMP와 다른점은 JUMP명령어들은 호출한 코드로 다시 돌아올 수 없지만 CALL은 가능.
- usage : CALL op1
☞ op1 : 호출할 함수의 주소 (함수이름)
- Return Address (복귀주소)
: 돌아올 주소를 함수가 기록하는게 아니고 CALL 명령어가 stack에 저장함. 그 다음 EIP 변경
: 대신 함수 마지막에서는 stack에서 복귀주소를 가져온다는 명령어를 씀. (RET)
#include <stdio.h> int sum() { int a = 1; int b = 2; return a + b; } int main() { int result = 0; printf("%d\n", result); _asm { CALL sum mov result, eax } printf("%d\n", result); return 0; }
- 실행 결과
- CALL 사용 시, stack 상태
▣ RET
- 스택 최상단의 값을 EIP에 넣음.
- 모든 함수의 가장 마지막 코드.
- 동작 자체로는 POP과 동일. (POP EIP : 대신 POP은 EIP를 operand로 쓰지 못함)
☞ EIP를 변경할 수 있는 명령어 3가지 : JMP, CALL, RET
☞ 대신 JMP, CALL은 자신의 op값으로 바꾸기때문에 잘 쓰이지 않고 RET은 스택 값으로 바꾸기때문에 BOF에서 많이 쓰임.
- Return Address 때문에 함수가 끝이 날 때 ESP는 원래 자리에 있어야함.
#include <stdio.h> int main() { _asm { RET } return 0; }
▣ NOP
- 아무런 동작도 수행하지 않음.
- 단지, 딱 하나의 값이 바뀜. == EIP (다음 명령어 실행을 위하여)
- 쓰는 이유
①
②
i2sec 대구지점 23기 수료생.
'해킹&보안 > 리버싱' 카테고리의 다른 글
[D+8] PE 구조 (0) | 2017.04.10 |
---|---|
[D+7] 함수호출규약 (0) | 2017.03.30 |
[D+5] 리버싱 소개 (5) (0) | 2017.03.27 |
[D+4] 리버싱 소개 (4) (0) | 2017.03.26 |
[D+3] 리버싱 소개 (3) (0) | 2017.03.23 |