ARM v6/v7 プラットフォームでの XN ビットのハードウェア サポートを検証していました。このために、ARM で execstack.c を実行しました。ARM v6/v7 の XN ビット サポートがあるため、クラッシュしています。次に、XIビットをサポートしていないMIPSターゲット(34Kc)で同じことを確認したため、プログラムは正常に実行する必要がありますが、ここでもこのプログラムがクラッシュしました。次に、XN ビット コードを削除し、ARM 用にコンパイルしました。その後、クラッシュしてはならないプログラムもクラッシュしました。
Test Program /* execstack.c - スタック上のコードを実行できるかどうかをテストします
*/
typedef void (*fptr)(void);
char *testname = "Executable stack ";
void itworked( void )
{
printf( "Vulnerable\n" );
exit( 1 );
}
void doit( void )
{
char buf[8192];
fptr func;
/* Put a RETN instruction in the buffer */
buf[0] = '\xc3';
/* Convert the pointer to a function pointer */
func = (fptr)buf;
/* Call the code in the buffer */
func();
/* It worked when the function returns */
itworked();
}
int main( int argc, char *argv[] )
{
int status;
printf( "%s: ", testname );
fflush( stdout );
if( fork() == 0 ) {
do_mprotect((unsigned long)argv & ~4095U, 4096, PROT_READ|PROT_WRITE|PROT_EXEC);
doit();
} else {
wait( &status );
if( WIFEXITED(status) == 0 ) {
printf( "Killed\n" );
exit( 0 );
}
}
exit( 0 );
}
void itfailed( void )
{
printf( "Ok\n" );
exit( 2 );
}
int do_mprotect( const void *addr, size_t len, int prot )
{
void *ptr;
int retval;
/* Allign to a multiple of PAGESIZE, assumed to be a power of two */
ptr = (char *)(((unsigned long) addr) & ~(PAGESIZE-1));
retval = mprotect( ptr, len, prot );
if( retval != 0 && errno == EINVAL ) {
perror( "could not mprotect():" );
exit( 1 );
}
return retval;
}
/MIPS ターゲットにログオンします/
MIPS ターゲットでは、コアダンプの下に execstack テストケースが表示されますが、MIPS では XI ビットがサポートされていないと想定しています。
VDLinux#> ./execstack
実行可能スタック [ 53.272000] do_ri() : SIGILL を execstack に送信中、PID:386
殺された
/ARM ターゲットにログオンします/
VDLinux#> ./execstack
実行可能スタック [ 451.784000] execstack: 0xbead5860 で未処理のページ フォールト (11)、コード 0x80000007 が強制終了されました
だから私は次の質問があります:
- ARM v6/V7 での XN ビットのサポートを確認するにはどうすればよいですか?
- MIPS 34Kc で XI ビットのサポートを確認する方法
- Linux カーネル コードで XN ビットのサポートを確認する場所。
ありがとう、ギリッシュ