* 문제)
-> 다음 코드에서 RET 값을 적절히 변경하여 첫 번째 printf함수가 아닌 다음 printf함수가 수행되도록 수정해본다.
* cdecl 함수호출 규약에서의 풀이
- 일단 아래와 같이 코드를 바꿔주면 문제를 해결할 수 있다.
- 우선 main함수에서 0040101C가 Func함수, 00401029가 첫 번째 printf함수, 00401036이 두 번째 printf함수라는 것을 확인한다.
- 첫 번째 함수를 건너 뛰고 두 번째 함수를 실행시켜야 하기 때문에 RET값을 첫 번째 printf함수를 실행하고 난 뒤의 주소로 바꾸어 줘야 한다.
- 포인터 연산으로 RET값을 바꾸기 전에는 아래와 같이 RET값이 정상적으로 들어가져 있다.
- 포인터 연산을 한 뒤에는 두 번째 함수를 실행하기 바로 전의 주소가 들어간다.
- *(&p+2)+=4; <-은 p변수가 위치한 주소에서 2만큼 더한 주소, 즉 RET값에 4를 더하라는 뜻이다.
4를 더하는 이유는 바꿀 주소가 RET와 16(16진수)만큼 떨어져 있기 때문이다. (int형 포인터 연산이기 때문에 16이 아니라 4를 더해준다.)
* stdcall 함수 호출 규약에서의 풀이
- 우선 main함수에서 0040101E가 Func함수, 00401028가 첫 번째 printf함수, 00401035이 두 번째 printf함수라는 것을 확인한다.
- 첫 번째 함수를 건너 뛰고 두 번째 함수를 실행시켜야 하기 때문에 RET값을 첫 번째 printf함수를 실행하고 난 뒤의 주소로 바꾸어 줘야 한다.
- 포인터 연산으로 RET값을 바꾸기 전에는 아래와 같이 RET값이 정상적으로 들어가져 있다.
- 포인터 연산을 한 뒤에는 두 번째 함수를 실행하기 바로 전의 주소가 들어간다.
- *(&p+2)+=13; <-은 p변수가 위치한 주소에서 2만큼 더한 주소, 즉 RET값에 13를 더하라는 뜻이다.
13를 더하는 이유는 바꿀 주소가 RET와 D(16진수)만큼 떨어져 있기 때문이다.
'Security > System' 카테고리의 다른 글
Buffer Overflow-2 (0) | 2018.01.29 |
---|---|
Buffer Overflow-1 (0) | 2018.01.27 |
RET값 변조 (0) | 2018.01.27 |
adminstrator, root 계정 패스워드 초기화 방법 (0) | 2018.01.13 |
리눅스 취약점 (0) | 2018.01.08 |
패스워드 크래킹 (0) | 2018.01.07 |
댓글0