2013-11-19 2 views
-1

Как и многие люди, мне поручена задача лаборатории бомб. Я смог сделать первые 3 довольно легко, но эта фаза ускользает от меня. Я решил, что ответ включает 2 ответа в виде% d% d, но я не смог выполнить рекурсивную сборку.Назначение двоичной бомбы в сборе Язык

Это задание, при котором учащемуся дается бомба, и он должен вводить различные входы, чтобы отключить все 6 этапов. Если пользователь вводит неправильный вход, бомба взрывается. Вы не получаете исходный код, а только исполняемый файл. Это разобранная фаза «фаза 4». Он также требует func4, так что он также разбирается.

Вот objdump -d из Phase_4 и func4, которые необходимы, чтобы обезвредить бомбу

Dump of assembler code for function phase_4: 
0x08048f41 <+0>:  push %ebp 
0x08048f42 <+1>:  mov %esp,%ebp 
0x08048f44 <+3>:  sub $0x28,%esp 
0x08048f47 <+6>:  lea -0x10(%ebp),%eax 
0x08048f4a <+9>:  mov %eax,0xc(%esp) 
0x08048f4e <+13>: lea -0xc(%ebp),%eax 
0x08048f51 <+16>: mov %eax,0x8(%esp) 
0x08048f55 <+20>: movl $0x804a64c,0x4(%esp) 
0x08048f5d <+28>: mov 0x8(%ebp),%eax 
0x08048f60 <+31>: mov %eax,(%esp) 
0x08048f63 <+34>: call 0x8048894 <[email protected]> 
0x08048f68 <+39>: cmp $0x2,%eax 
0x08048f6b <+42>: jne 0x8048f79 <phase_4+56> 
0x08048f6d <+44>: mov -0xc(%ebp),%eax 
0x08048f70 <+47>: test %eax,%eax 
0x08048f72 <+49>: js  0x8048f79 <phase_4+56> 
0x08048f74 <+51>: cmp $0xe,%eax 
0x08048f77 <+54>: jle 0x8048f7e <phase_4+61> 
0x08048f79 <+56>: call 0x80493e1 <explode_bomb> 
0x08048f7e <+61>: movl $0xe,0x8(%esp) 
0x08048f86 <+69>: movl $0x0,0x4(%esp) 
0x08048f8e <+77>: mov -0xc(%ebp),%eax 
0x08048f91 <+80>: mov %eax,(%esp) 
0x08048f94 <+83>: call 0x8048c80 <func4> 
0x08048f99 <+88>: cmp $0x12,%eax 
0x08048f9c <+91>: jne 0x8048fa4 <phase_4+99> 
0x08048f9e <+93>: cmpl $0x12,-0x10(%ebp) 
0x08048fa2 <+97>: je  0x8048fad <phase_4+108> 
0x08048fa4 <+99>: lea 0x0(%esi,%eiz,1),%esi 
0x08048fa8 <+103>: call 0x80493e1 <explode_bomb> 
0x08048fad <+108>: leave 
0x08048fae <+109>: xchg %ax,%ax 
0x08048fb0 <+111>: ret 
End of assembler dump. 

Dump of assembler code for function func4: 
0x08048c80 <+0>:  push %ebp 
0x08048c81 <+1>:  mov %esp,%ebp 
0x08048c83 <+3>:  sub $0x18,%esp 
0x08048c86 <+6>:  mov %ebx,-0x8(%ebp) 
0x08048c89 <+9>:  mov %esi,-0x4(%ebp) 
0x08048c8c <+12>: mov 0x8(%ebp),%eax 
0x08048c8f <+15>: mov 0xc(%ebp),%edx 
0x08048c92 <+18>: mov 0x10(%ebp),%esi 
0x08048c95 <+21>: mov %esi,%ecx 
0x08048c97 <+23>: sub %edx,%ecx 
0x08048c99 <+25>: mov %ecx,%ebx 
0x08048c9b <+27>: shr $0x1f,%ebx 
0x08048c9e <+30>: lea (%ebx,%ecx,1),%ecx 
0x08048ca1 <+33>: sar %ecx 
0x08048ca3 <+35>: lea (%ecx,%edx,1),%ebx 
0x08048ca6 <+38>: cmp %eax,%ebx 
0x08048ca8 <+40>: jle 0x8048cc1 <func4+65> 
0x08048caa <+42>: lea -0x1(%ebx),%ecx 
0x08048cad <+45>: mov %ecx,0x8(%esp) 
0x08048cb1 <+49>: mov %edx,0x4(%esp) 
0x08048cb5 <+53>: mov %eax,(%esp) 
0x08048cb8 <+56>: call 0x8048c80 <func4> 
0x08048cbd <+61>: add %eax,%ebx 
0x08048cbf <+63>: jmp 0x8048cda <func4+90> 
0x08048cc1 <+65>: cmp %eax,%ebx 
0x08048cc3 <+67>: jge 0x8048cda <func4+90> 
0x08048cc5 <+69>: mov %esi,0x8(%esp) 
0x08048cc9 <+73>: lea 0x1(%ebx),%edx 
0x08048ccc <+76>: mov %edx,0x4(%esp) 
0x08048cd0 <+80>: mov %eax,(%esp) 
0x08048cd3 <+83>: call 0x8048c80 <func4> 
0x08048cd8 <+88>: add %eax,%ebx 
0x08048cda <+90>: mov %ebx,%eax 
0x08048cdc <+92>: mov -0x8(%ebp),%ebx 
0x08048cdf <+95>: mov -0x4(%ebp),%esi 
0x08048ce2 <+98>: mov %ebp,%esp 
0x08048ce4 <+100>: pop %ebp 
0x08048ce5 <+101>: ret 
End of assembler dump. 
+0

Дубликат [Q19646901] (http://stackoverflow.com/questions/19640148/binary-bomb-phase-4/19646901) с ожидаемым значением 18. – Jester

ответ

0

Edit: на самом деле, было очень уставшим ... смешиваясь аргументы и местные варры обычно не являются ошибкой, которую я делаю ...

Исправленная обратная инженерия:
Все еще только части этого, для phase4():

0x08048f47 <+6>:  lea -0x10(%ebp),%eax 
0x08048f4a <+9>:  mov %eax,0xc(%esp)   <== arg3 (&(int l)) sscanf() 
0x08048f4e <+13>: lea -0xc(%ebp),%eax 
0x08048f51 <+16>: mov %eax,0x8(%esp)   <== arg2 (&(int m)) sscanf() 
0x08048f55 <+20>: movl $0x804a64c,0x4(%esp)  <== arg0 (fmt) sscanf() 
0x08048f5d <+28>: mov 0x8(%ebp),%eax 
0x08048f60 <+31>: mov %eax,(%esp)    <== arg0 --> arg1 sscanf() 
0x08048f63 <+34>: call 0x8048894 <[email protected]> 
0x08048f68 <+39>: cmp $0x2,%eax 
0x08048f6b <+42>: jne 0x8048f79 <phase_4+56> <== if (sscanf(...) != 2) 
0x08048f6d <+44>: mov -0xc(%ebp),%eax     explode_bomb(); 
0x08048f70 <+47>: test %eax,%eax 
0x08048f72 <+49>: js  0x8048f79 <phase_4+56> <== if (m < 0) // signed 
0x08048f74 <+51>: cmp $0xe,%eax       explode_bomb(); 
0x08048f77 <+54>: jle 0x8048f7e <phase_4+61> <== if (!(m <= 14)) 
0x08048f79 <+56>: call 0x80493e1 <explode_bomb>   explode_bomb(); 
[ ... ] 
0x08048f94 <+83>: call 0x8048c80 <func4> 
0x08048f99 <+88>: cmp $0x12,%eax    <== if (func4(...) != 18) 
0x08048f9c <+91>: jne 0x8048fa4 <phase_4+99>   explode_bomb(); 
0x08048f9e <+93>: cmpl $0x12,-0x10(%ebp)   <== if (l != 18) 
0x08048fa2 <+97>: je  0x8048fad <phase_4+108>   explode_bomb(); 
0x08048fa4 <+99>: lea 0x0(%esi,%eiz,1),%esi 
0x08048fa8 <+103>: call 0x80493e1 <explode_bomb> 
0x08048fad <+108>: leave 

Так что это вызывает sscanf() с форматом строкой, хранящейся в 0x804a64c (вероятно "%d %d"), давая аргумент phase4(), как струна к разбору; то есть в источнике C, это sscanf("%d "%d", phase4_arg, &l, &m); с l и m являются локальными int vars. Он проверяет, что два числа успешно проанализированы, а затем проверяет их значения.

+1

Просто из любопытства: я был примерно таким же глубоким, как и вы здесь, с тем же переводом ... когда я заметил, что то, что вы переводите как argv3 (я сделал то же самое), на самом деле имеет труднодоступную ссылку «-» на% ebp - или, по крайней мере, кажется ... который, если это правда, делает это странным. – gnometorule

+0

Ха, спасибо за пятнистость ... уже слишком устал там :) –

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