#include #include int main(int argc, char **argv) { int pad = 0xbabe; char buf[1024]; strncpy(buf, argv[1], sizeof(buf) - 1); printf(buf); return 0; } FTZ11번, 20번에 있는 FSB(Format String Bug)랑 똑같은 문제. printf(buf); 에서 FSB취약점이 발생한다.일단 덮어쓸 곳과 덮을 곳이 필요하다. NX-Bit가 걸려있지 않고 ASLR이 걸려있지 않기 때문에Shell-Code를 환경변수에 올려두고 기본적으로 프로그램에서 제공해주는소멸자인 .dtors(무조건 실행됨)을 덮어씌워 보자. [17] .dtors PROGBITS 080494d0 0004d0 000008..
// writen by bla for io.smashthestack.org #include #include #include class Number { public: Number(int x) : number(x) {} void setAnnotation(char *a) { memcpy(annotation, a, strlen(a)); } virtual int operator+(Number &r) { return number + r.number; } private: char annotation[100]; int number; }; int main(int argc, char **argv) { if(argc
//written by bla #include #include #include int main(int argc, char **argv) { int count = atoi(argv[1]); int buf[10]; if(count >= 10 ) { return 1; } memcpy(buf, argv[2], count * sizeof(int)); if(count == 0x574f4c46) // 1464814662 { printf("WIN!\n"); execl("/bin/sh", "sh" ,NULL); } else { printf("Not today son\n"); } return 0; } 기본적인 Int Overflowe문제. 참고int 의 최소값: -2147483648int 의 최대값: 2147483647 ..
//written by bla //inspired by nnp #include #include #include enum { LANG_ENGLISH, LANG_FRANCAIS, LANG_DEUTSCH, }; int language = LANG_ENGLISH; struct UserRecord { char name[40]; char password[32]; int id; }; void greetuser(struct UserRecord user) { char greeting[64]; switch (language) { case LANG_ENGLISH: strcpy(greeting, "Hi "); break; case LANG_FRANCAIS: strcpy(greeting, "Bienvenue "); break;..
//writen by bla #include #include int main() { char username[1024]; FILE* f = popen("whoami","r"); fgets(username, sizeof(username), f); printf("Welcome %s", username); return 0; } 푸는법을 생각하다가 $PATH환경변수 변조를 택함/tmp/err0rless에 내가 만든 whoami를 만들면 popem으로 연 whoami가내가 조작한 whoami로 실행될 것이다. level4@io:/levels$ ls /tmp/err0rlesswhoami whoami.clevel4@io:/levels$ cat /tmp/err0rless/whoami.c#include main() { ..
//bla, based on work by beach #include #include void good() { puts("Win."); execl("/bin/sh", "sh", NULL); } void bad() { printf("I'm so sorry, you're at %p and you want to be at %p\n", bad, good); } int main(int argc, char **argv, char **envp) { void (*functionpointer)(void) = bad; char buffer[50]; if(argc != 2 || strlen(argv[1])
//a little fun brought to you by bla #include #include #include #include void catcher(int a) { setresuid(geteuid(),geteuid(),geteuid()); printf("WIN!\n"); system("/bin/sh"); exit(0); } int main(int argc, char **argv) { puts("source code is available in level02.c\n"); if (argc != 3 || !atoi(argv[2])) return 1; signal(SIGFPE, catcher); return abs(atoi(argv[1])) / atoi(argv[2]); } SIGFPE는 int형 오류가 ..