[ale] C question

Alex Carver agcarver+ale at acarver.net
Tue May 27 16:11:40 EDT 2014


Well, to start with the most simple change, after your #includes I would
add:

#define CMDBUFF 512

and then your declaration of Command[] becomes

char Command[CMDBUFF];

the sprintf() then changes to:

snprintf(Command, CMDBUFF-1, "ssh user2 at server...blahblahblah %s", argv[1]);

That prevents a possible overflow of Command[] which could lead to all
sorts of nasties.


The other things I would do which involves more code would be to test
the length of argv[1] (strlen() should do), determine if it's five or
less characters from that, cut out the first five (or less) characters
and copy them to a new buffer, run the comparison using the already
provided is_5char_alnum() function and then snprintf() that trimmed
buffer into Command[].

So I might do something like:

#define TRIMARGV 6 /* this is in the declarations at top of file */

char trimmed_argv[TRIMARGV];
char * CommandPtr;
CommandPtr = Command; /* note the new declarations to eliminate the
(char *) casting in system() */

snprintf(trimmed_argv, TRIMARGV-1, "%s", argv[1]); /* copies no more
than TRIMARGV-1 bytes to trimmed_argv[], stops early if argv[1] is null
terminated within the length TRIMARGV-1 */

/* an alternative could be memcpy(trimmed_argv, argv[1], LENGTH); where
LENGTH is a computed number based on strlen(argv[1]) and the value of
TRIMARGV-1 others may wish to chime in here */

if ( is_5char_alnum(trimmed_argv) )
{
	snprintf(Command, CMDBUFF-1, "ssh lorem ipsum...%s", trimmed_argv);
	system(CommandPtr);
}
else
{
	fprintf(stderr, "Nope, sorry\n"); /* print to the standard error output
instead of standard output */
}

On 2014-05-27 12:39, Robert L. Harris wrote:
> How to call it, the example you gave is what I was looking for, and I'll
> put that in.
> 
> If you have an example which is simple ( so I don't have to figure out what
> are the relevant parts ) I would like to learn some of this.  The only
> thing is this is the first C program I've written in over 20 years and very
> likely the last for the next 20, I just don't have reason to do it.
> 
> Robert
> 
> 
> 
> On Tue, May 27, 2014 at 1:29 PM, Alex Carver <agcarver+ale at acarver.net>wrote:
> 
>> It's already written as a function definition, you just have to put it
>> in the file and then call it in your program before the system() call:
>>
>> int main(int argc, char **argv)
>> {
>>    setuid( 662705787 );
>>
>>    char Command[512];
>>    if ( is_5char_alnum(argv[1]) == 1 )
>>    {
>>         sprintf(Command, "ssh user2 at Server2 -C '/home/user2/bin/Test.sh
>> %s'", argv[1]);
>>       system((char *)Command);
>>    }
>>    else
>>    {
>>      printf("Bad input\n");
>>    }
>>    return 0;
>> }
>>
>>
>> Though you really should adjust things to use snprintf() and reparse
>> argv[] into another variable first to sanitize it before feeding it into
>> a command.
>>



More information about the Ale mailing list