#define _POSIX_C_SOURCE 200112L
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/types.h>
#if defined(__i386__)
#define LD "/lib/ld-linux.so.2"
#elif defined(__x86_64__)
#define LD "/lib64/ld-linux-x86-64.so.2"
#else
#error "expected x86"
#endif
static void execve_wrapper( const char * pgm, char * argv[ ] , char * envp[ ] )
{
printf ( "execve(\" %s\" , {" , pgm
) ; for ( int i = 0 ; argv[ i] ; i++ ) {
printf ( "\" %s\" %s" , argv
[ i
] , ( argv
[ i
+ 1 ] ) ? ", " : "});\n \n " ) ; }
execve( pgm, argv, envp) ;
}
int main( int argc, char * argv[ ] , char * envp[ ] )
{
char self[ 1024 ] ;
size_t rc = readlink( "/proc/self/exe" , self, sizeof ( self) ) ;
if ( rc == - 1 ) {
}
self[ rc] = '\0 ' ;
printf ( "/proc/self/exe -> %s\n " , self
) ; for ( int i = 0 ; i < argc; i++ ) {
printf ( "argv[%i] = \" %s\" \n " , i
, argv
[ i
] ) ; }
if ( argc < 2 ) {
puts ( "Мы не можем доверять argv[0], там может быть любой мусор" ) ; execve_wrapper( self, ( char * [ ] ) { "C:\\ WINDOWS\\ NOTEPAD.EXE" , "stage=ld" , NULL} , envp) ;
} else if ( strcmp ( argv
[ 1 ] , "stage=ld" ) == 0 ) { puts ( "Но /proc/self/exe мы тоже не можем доверять" ) ; execve_wrapper( LD, ( char * [ ] ) { LD, self, "stage=done" , NULL} , envp) ;
} else if ( strcmp ( argv
[ 1 ] , "stage=done" ) == 0 ) { return 0 ;
}
}
I2RlZmluZSBfUE9TSVhfQ19TT1VSQ0UgMjAwMTEyTAojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkaW50Lmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKI2lmIGRlZmluZWQoX19pMzg2X18pCiAgICAjZGVmaW5lIExEICIvbGliL2xkLWxpbnV4LnNvLjIiCiNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKICAgICNkZWZpbmUgTEQgIi9saWI2NC9sZC1saW51eC14ODYtNjQuc28uMiIKI2Vsc2UKICAgICNlcnJvciAiZXhwZWN0ZWQgeDg2IgojZW5kaWYKCnN0YXRpYyB2b2lkIGV4ZWN2ZV93cmFwcGVyKGNvbnN0IGNoYXIgKnBnbSwgY2hhciAqYXJndltdLCBjaGFyICplbnZwW10pCnsKICAgIHByaW50ZigiZXhlY3ZlKFwiJXNcIiwgeyIsIHBnbSk7CiAgICBmb3IgKGludCBpID0gMDsgYXJndltpXTsgaSsrKSB7CiAgICAgICAgcHJpbnRmKCJcIiVzXCIlcyIsIGFyZ3ZbaV0sIChhcmd2W2kgKyAxXSkgPyAiLCAiIDogIn0pO1xuXG4iKTsKICAgIH0KICAgIGZmbHVzaChzdGRvdXQpOwogICAgZXhlY3ZlKHBnbSwgYXJndiwgZW52cCk7CiAgICBwZXJyb3IoImV4ZWN2ZSgpIik7CiAgICBleGl0KEVYSVRfRkFJTFVSRSk7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10sIGNoYXIgKmVudnBbXSkKewogICAgY2hhciBzZWxmWzEwMjRdOwogICAgc2l6ZV90IHJjID0gcmVhZGxpbmsoIi9wcm9jL3NlbGYvZXhlIiwgc2VsZiwgc2l6ZW9mKHNlbGYpKTsKICAgIGlmIChyYyA9PSAtMSkgewogICAgICAgIHBlcnJvcigicmVhZGxpbmsoKSIpOwogICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKICAgIH0KICAgIHNlbGZbcmNdID0gJ1wwJzsKCiAgICBwcmludGYoIi9wcm9jL3NlbGYvZXhlIC0+ICVzXG4iLCBzZWxmKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgcHJpbnRmKCJhcmd2WyVpXSA9IFwiJXNcIlxuIiwgaSwgYXJndltpXSk7CiAgICB9CgogICAgaWYgKGFyZ2MgPCAyKSB7CiAgICAgICAgcHV0cygi0JzRiyDQvdC1INC80L7QttC10Lwg0LTQvtCy0LXRgNGP0YLRjCBhcmd2WzBdLCDRgtCw0Lwg0LzQvtC20LXRgiDQsdGL0YLRjCDQu9GO0LHQvtC5INC80YPRgdC+0YAiKTsKICAgICAgICBleGVjdmVfd3JhcHBlcihzZWxmLCAoY2hhciAqW10peyJDOlxcV0lORE9XU1xcTk9URVBBRC5FWEUiLCAic3RhZ2U9bGQiLCBOVUxMfSwgZW52cCk7CiAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAic3RhZ2U9bGQiKSA9PSAwKSB7CiAgICAgICAgcHV0cygi0J3QviAvcHJvYy9zZWxmL2V4ZSDQvNGLINGC0L7QttC1INC90LUg0LzQvtC20LXQvCDQtNC+0LLQtdGA0Y/RgtGMIik7CiAgICAgICAgZXhlY3ZlX3dyYXBwZXIoTEQsIChjaGFyICpbXSl7TEQsIHNlbGYsICJzdGFnZT1kb25lIiwgTlVMTH0sIGVudnApOwogICAgfSBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgInN0YWdlPWRvbmUiKSA9PSAwKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn0K