#include <stdio.h>
#include <unistd.h>
#include <string.h>
int good(int addr) {
printf("Address of hmm: %p\n", addr);
}
int hmm() {
printf("Win.\n");
execl("/bin/sh", "sh", NULL);
}
extern char **environ;
int main(int argc, char **argv) {
int i, limit;
for(i = 0; environ[i] != NULL; i++)
memset(environ[i], 0x00, strlen(environ[i]));
int (*fptr)(int) = good;
char buf[32];
if(strlen(argv[1]) <= 40) limit = strlen(argv[1]);
for(i = 0; i <= limit; i++) {
buf[i] = argv[1][i];
if(i < 36) buf[i] = 0x41;
}
int (*hmmptr)(int) = hmm;
(*fptr)((int)hmmptr);
return 0;
}
Я скомпилировал приведенную выше программу на C от имени пользователя root без какой-либо защиты стека (gcc -fno-stack-protector -o out test.c) и воспользовался ею как обычный пользователь. Мне не удалось получить корневую оболочку.
Это тот же код, который я использовал в 'smashthestack'.
integer
, вам нужно сделать&integer_variable
, поэтомуprintf()
должно бытьprintf("Address of hmm: %p\n", &addr);
- person Sangeeth Saravanaraj   schedule 28.12.2011(char*)NULL
, в чем проблема? - person Daniel Fischer   schedule 28.12.2011