#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나머지로 끝난다.
'코스웨어 > 13년 스마트컨트롤러' 카테고리의 다른 글
어셈블리어 프로시저(함수)를 C 코드로 호출하여 쓰기 (0) | 2013.09.13 |
---|---|
130912 목요일 어셈블리+C 조유진 (0) | 2013.09.12 |
20130912 어셈+C언어 합치기 (0) | 2013.09.12 |
추석에 다같이 얼굴함 봅시더~~ (9) | 2013.09.12 |
ARM으로 LCD찍을 때 sprintf 활용하기 (0) | 2013.09.06 |
다들 ㅎㅇㅎㅇ (5) | 2013.09.06 |
기초 어셈블리 조건문 5.2 Conditional Jumps 숙제 (0) | 2013.09.04 |
2013.09.04_jmp instruction 과제_ 김성엽 (0) | 2013.09.04 |