Изучение 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