2015-03-07 2 views
0

Я, честно говоря, очень смущен этим из-за моей фазы бомбы 3, не похожей ни на одного из моих одноклассников или на пример, предоставленный мне моим профессором. Любая помощь будет принята с благодарностью. У меня есть копия моего последнего терминала для использования, и я положил . Я пробовал свою руку на этом в течение большей части 5 часов, я получил достаточно далеко, чтобы знать, что% d% d - запрошенная макет, и что его просят 2 номера, я считаю, что один из них является отрицательным. В связи с утверждением сравнения и JG здесьДвоичная фаза бомбы 3 застряла

0x08048fbb <+39>: cmp $0x1,%eax 
    0x08048fbe <+42>: jg  0x8048fc5 <phase_3+49> 

Кроме того, что его призыв к другому по сравнению с тем же значением, которое я думаю, что это первый здесь

0x08048fc5 <+49>: cmpl $0x7,-0xc(%ebp) 
    0x08048fc9 <+53>: ja  0x8049032 <phase_3+158> 

Что бросает меня все дополнения и вычесть сразу с места в карьер и, как правило, все сложение и вычитание, которые забиты на дно.

Где я могу найти значения, которые действительно работают с этими операторами в endor, я должен просто добавить числа, которые я вижу. В этот момент я даже не знаю, смотрит ли он на меня в лицо. Все сравнения, как следует

0x08048fbb <+39>: cmp $0x1,%eax 

< 0x08048fbe +42>: JG 0x8048fc5

0x08048fc5 <+49>: cmpl $0x7,-0xc(%ebp) 
    0x08048fc9 <+53>: ja  0x8049032 <phase_3+158> 

    0x0804903c <+168>: cmpl $0x5,-0xc(%ebp) 
    0x08049040 <+172>: jg  0x8049047 <phase_3+179> 

Но вся его кашице в данный момент мне нужен новый набор глаза на этой проблеме. Если его там, то любая помощь будет принята с благодарностью.

That's number 2. Keep going! 
0 1 

Breakpoint 1, 0x08048f9a in phase_3() 
(gdb) disas 
Dump of assembler code for function phase_3: 
    0x08048f94 <+0>:  push %ebp 
    0x08048f95 <+1>:  mov %esp,%ebp 
    0x08048f97 <+3>:  sub $0x28,%esp 
=> 0x08048f9a <+6>:  lea -0x10(%ebp),%eax 
    0x08048f9d <+9>:  mov %eax,0xc(%esp) 
    0x08048fa1 <+13>: lea -0xc(%ebp),%eax 
    0x08048fa4 <+16>: mov %eax,0x8(%esp) 
    0x08048fa8 <+20>: movl $0x804a58c,0x4(%esp) 
    0x08048fb0 <+28>: mov 0x8(%ebp),%eax 
    0x08048fb3 <+31>: mov %eax,(%esp) 
    0x08048fb6 <+34>: call 0x8048894 <[email protected]> 
    0x08048fbb <+39>: cmp $0x1,%eax 
    0x08048fbe <+42>: jg  0x8048fc5 <phase_3+49> 
    0x08048fc0 <+44>: call 0x8049321 <explode_bomb> 
    0x08048fc5 <+49>: cmpl $0x7,-0xc(%ebp) 
    0x08048fc9 <+53>: ja  0x8049032 <phase_3+158> 
    0x08048fcb <+55>: mov -0xc(%ebp),%eax 
    0x08048fce <+58>: xchg %ax,%ax 
    0x08048fd0 <+60>: jmp *0x804a4c0(,%eax,4) 
    0x08048fd7 <+67>: mov $0x0,%eax 
    0x08048fdc <+72>: lea 0x0(%esi,%eiz,1),%esi 
    0x08048fe0 <+76>: jmp 0x804902d <phase_3+153> 
    0x08048fe2 <+78>: mov $0x0,%eax 
    0x08048fe7 <+83>: jmp 0x804902a <phase_3+150> 
    0x08048fe9 <+85>: mov $0x0,%eax 
    0x08048fee <+90>: xchg %ax,%ax 
    0x08048ff0 <+92>: jmp 0x8049027 <phase_3+147> 
    0x08048ff2 <+94>: mov $0x0,%eax 
    0x08048ff7 <+99>: jmp 0x8049024 <phase_3+144> 
    0x08048ff9 <+101>: mov $0x0,%eax 
    0x08048ffe <+106>: xchg %ax,%ax 
    0x08049000 <+108>: jmp 0x8049021 <phase_3+141> 
    0x08049002 <+110>: mov $0x0,%eax 
    0x08049007 <+115>: jmp 0x804901c <phase_3+136> 
    0x08049009 <+117>: mov $0x30d,%eax 
    0x0804900e <+122>: xchg %ax,%ax 
    0x08049010 <+124>: jmp 0x8049017 <phase_3+131> 
    0x08049012 <+126>: mov $0x0,%eax 
    0x08049017 <+131>: sub $0x264,%eax 
    0x0804901c <+136>: add $0x3b8,%eax 
    0x08049021 <+141>: sub $0x49,%eax 
    0x08049024 <+144>: add $0x49,%eax 
    0x08049027 <+147>: sub $0x49,%eax 
    0x0804902a <+150>: add $0x49,%eax 
    0x0804902d <+153>: sub $0x49,%eax 
    0x08049030 <+156>: jmp 0x804903c <phase_3+168> 
    0x08049032 <+158>: call 0x8049321 <explode_bomb> 
    0x08049037 <+163>: mov $0x0,%eax 
    0x0804903c <+168>: cmpl $0x5,-0xc(%ebp) 
    0x08049040 <+172>: jg  0x8049047 <phase_3+179> 
    0x08049042 <+174>: cmp -0x10(%ebp),%eax 
    0x08049045 <+177>: je  0x804904c <phase_3+184> 
    0x08049047 <+179>: call 0x8049321 <explode_bomb> 
    0x0804904c <+184>: leave 
    0x0804904d <+185>: lea 0x0(%esi),%esi 
    0x08049050 <+188>: ret 
End of assembler dump. 
(gdb) 

ответ

3

Первое сравнение вы упомянули (один в +39) является сравнение %eax который содержит возвращаемое значение sscanf. Таким образом, это просто проверка того, сколько аргументов может быть преобразовано. Этот код требует 2, таким образом, что код делает if (sscanf() > 1) goto ok; explode_bomb();

Проведено сравнение на +49 проверяет первый номер, он делает if ((unsigned)x > 7) explode_bomb(); я надеюсь, что это очевидно.

Далее, в +60, у вас есть самая важная инструкция в этой части кода: jmp *0x804a4c0(,%eax,4). Это прыжок через таблицу прыжков. Он перенесет вас в разные места в зависимости от значения в %eax, который в этот момент держит ваш первый вход. Мы знаем, что ввод находится между 0 и 7, поэтому у вас есть 8 записей в этой таблице. Вы должны изучить их с помощью x/8a 0x804a4c0. Справедливо предположить, что они являются различными адресами в следующем блоке кода, и поток присоединяется к +163. Этот шаблон обычно используется компиляторами для реализации инструкции switch.

линия +168 дополнительно ограничивает первое число к между 0 и 5, а линия +174 сравнивает второе число к текущему значению %eax и взрывает бомбу на несоответствие. Это говорит о том, что действительные входы образуют 6 пар. Мы можем выбрать произвольное первое число, проследовать через таблицу перехода и посмотреть, какое значение будет помещено в %eax и ввести это как второе число.

Смежные вопросы