Назначение - интерпретировать некоторый код сборки, чтобы найти фразу, которая будет работать без вызова «взрывной бомбы». Я использую 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, и программа будет пропускать «взорвать бомбу». Я просто хочу знать, где я возился до этого момента.