ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RET값 변조
    Security/System 2018.01.27 15:12

    * 문제)

    -> 다음 코드에서 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

~ ^ . ^ ~