2015-02-07 2 views
0

Назначение - интерпретировать некоторый код сборки, чтобы найти фразу, которая будет работать без вызова «взрывной бомбы». Я использую gdb, чтобы разобрать текущую фазу. Я застрял, и любые советы о том, движется ли я в правильном направлении, будут очень благодарны.пытается разобрать

0x0000000000400fb5 <+0>: sub $0x18,%rsp   
0x0000000000400fb9 <+4>: lea 0x8(%rsp),%r8 
0x0000000000400fbe <+9>: lea 0xf(%rsp),%rcx 
0x0000000000400fc3 <+14>: lea 0x4(%rsp),%rdx 

Я считаю, что это происходит, что мы смотрим на фразу в% РСП (то, что базовый указатель, указывающий на). Я думаю, что это четыре вещи, которые были сохранены в памяти, в (% rsp), 0x4 (% rsp), 0x8 (% rsp) и 0xf (% rsp), которые, как я думаю, составляют три целых числа и что-то еще, но я не конечно какой.

0x0000000000400fc8 <+19>: mov $0x4028f6,%esi   

Значение по адресу $ 0x4028f6 - «% d% c% d». Я знаю, что он перемещается для регистрации% esi, но я не уверен, как это используется.

0x0000000000400fcd <+24>: mov $0x0,%eax    
0x0000000000400fd2 <+29>: callq 0x400c80 <[email protected]> 

Не уверен, что здесь происходит. Я посмотрел на 0x400c80 и нашел следующее:

0x0000000000400c80 <+0>: jmpq *0x20340a(%rip)   
0x0000000000400c86 <+6>: pushq $0x12 
0x0000000000400c8b <+11>: jmpq 0x400b50 

Я не вижу% рип используется как регистр, так что я не совсем уверен, что делать и куда смотреть. Я думаю, что он помещает 0x12 в% eax, но тогда я не уверен, где он прыгает, так как 0x400b50 не является действительным адресом. Во всяком случае, обратно к исходной функции:

0x0000000000400fd7 <+34>: cmp $0x2,%eax    
0x0000000000400fda <+37>: jg  0x400fe1 <phase_3+44> 
0x0000000000400fdc <+39>: callq 0x401719 <explode_bomb> 

Я думаю, что мы просто толкнул 0x18 на% EAX, так что это, безусловно, будет больше, чем 0x2, и программа будет пропускать «взорвать бомбу». Я просто хочу знать, где я возился до этого момента.

ответ

0

К сожалению, вам, похоже, не хватает важных знаний. Вы должны пересмотреть любой материал, который у вас может быть иначе, иначе вам не удастся с остальной частью задания, которое фактически будет включать в себя несколько менее тривиальный код.

Тем не менее, блок вы процитировали до сих пор только делает следующее:

int x, y; 
char c; 
if (sscanf(foo, "%d %c %d", &x, &c, &y) <= 2) explode_bomb(); 

Первый блок выделяет 3 локальных переменных и загружает адрес каждого в соответствующий регистр для соответствующего sscanf аргумента , Обратите внимание, что x86-64 соглашение о вызовах используют регистры rdi, rsi, rcx, rdx, r8 и r9 в течение первых шести аргументов (при условии, что они подходят) и значение, возвращаемые в rax.

Вам не нужно смотреть 0x400c80, вы можете найти запись PLT, которая в конечном итоге переходит на sscanf. Мы уже знаем, что это sscanf от имени символа.

0

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

  • вычитая из указателя стека довольно стандартный способ распределения пространства для локальной области видимости переменных при вводе функция

  • google for intel opcodes, например «lea» - это что-то вроде «загружаемого эффективного адреса».Он не загружает данные

  • google sscanf, это функция библиотеки Scandard C и есть стандарт языка C99 C. Он считывает данные из строк и берет строку данных, строку формата с% -специфическими спецификаторами преобразования и указатели на переменные, в которые помещаются отсканированные и преобразованные данные. Не нужно отслеживать внутренности sscanf, но посмотрите его возвращаемое значение

  • Функции C чаще всего возвращают их результат в% eax. % EAX очищается перед вызовом, и проходят после вызова, и бомба избежать (или нет) условно на основании результатов

И это должно дать вам достаточно, чтобы понять это. Повеселись!