본문 바로가기
코스웨어/13년 스마트컨트롤러

130911 수 숙제 조유진

by 알 수 없는 사용자 2013. 9. 11.
728x90
반응형

#include <stdio.h>


void Hack();

void Test( int );


int main()

{

int iNum = 7;


printf( "Address of iNum\t: %08X\n", &iNum );


Test( iNum );


printf( "This message will not apear.\n" );


return 0;

}


void Hack()

{

printf( "You are HACKED!\n" );


exit( 0 ); // exit가 없으면 팅겨버린다.


/* 메인의 스택을 참조하고 있으므로 Return Address를 엉뚱한 값을 골라버리므로

  팅겨버릴 수 밖에 없다.

*/

}


void Test( int a )

{

int b = 100;


printf( "Address of a\t: %08X\n", &a );

printf( "Address of b\t: %08X\n", &b );


printf( "TEST() : %d\n", a );


*(( int* )( &a-1 )) = ( int )Hack;

/* 원래 Return Address에 printf( "This message will not apear.\n" );의

  명령어 주소가 들어 있어야 하지만 이것을 Hack의 주소로 바꾸어

  엉뚱한 데로 이동시켜버림

*/

}



작동 원리

1. main에서 Test 호출

2. Test함수의 스택에서 원래 주소와 인자, 변수를 갖고 있음

3. Test가 끝나면 Return address로 점프하며, EBP와 ESP를 원상복귀시킴

-> 여기서 RA만 Hack을 가르키도록 변경

4. Hack을 수행

5. Hack의 리턴 어드레스로 되돌아감

-> EBP와 ESP는 원상복귀되어 main에 있지만(추측), Hack이 되돌아갈 위치에 쓰레기 값이 있음!

6. 당연하게 터짐



추가

- Hack에서 Return address에 다시 Hack을 넣어주면 계속 Hack을 수행하다 자동으로 꺼진다.

- 전역변수를 생성하여 Test의 원래 Return address를 저장하여 Hack의 Return address위치에 대입하면 평범하게 main->Test->Hack->main나머지로 끝난다.

728x90