본문으로 바로가기

[D+6] 리버싱 소개 (6)

category 해킹&보안/리버싱 2017. 3. 28. 20:52
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