Я студент CS, изучающий сборку IA-32. Для проекта нам был предоставлен исполняемый файл для программы. Мы можем использовать objdump
и другие инструменты для проверки двоичных файлов, но не можем видеть исходный код. Программа принимает входную строку и сравнивает ее с другой тайной строкой. Если две строки: не то же самое, программа отключает будильник, и я перехватываю задание. Это было бы веселое задание ... если бы TA потрудилась ответить на мои вопросы ... Gr12 ...Чтение кода сборки IA32 - определение скрытой строки?
Так что если вы не возражаете, чтобы дать мне несколько указателей, я бы хотел спросить форум, если Я на правильном пути. Когда я бегу objdump -d CODE
на код, исполняемый, я могу развернуть и увидеть это в основной функции():
08048a44 <main>:
...
8048af6: e8 d0 08 00 00 call 80493cb <get_string>
8048afb: 89 04 24 mov %eax,(%esp)
8048afe: e8 ad 00 00 00 call 8048bb0 <test_string>
Я достаточно уверен, что get_string()
получает строку от пользователя - его, вероятно, функция упаковщик для fscanf()
или что-то - и тогда указатель на эту строку сохраняется в регистре %eax
. Следующая строка перемещает указатель на %esp
, затем вызывает test_string()
. Вот этот код:
08048bb0 <test_string>:
8048bb0: 83 ec 1c sub $0x1c,%esp
8048bb3: c7 44 24 04 6c a4 04 movl $0x804a46c,0x4(%esp)
8048bba: 08
8048bbb: 8b 44 24 20 mov 0x20(%esp),%eax
8048bbf: 89 04 24 mov %eax,(%esp)
8048bc2: e8 bd 04 00 00 call 8049084 <cmp_strings>
8048bc7: 85 c0 test %eax,%eax
8048bc9: 74 05 je 8048bd0 <test_string+0x20>
8048bcb: e8 bc 07 00 00 call 804938c <alarm>
8048bd0: 83 c4 1c add $0x1c,%esp
8048bd3: c3 ret
Вот что я думаю, что происходит ...
08048bb0 <test_string>:
8048bb0: sub $0x1c,%esp // Adjusts %esp for new function
8048bb3: movl $0x804a46c,0x4(%esp) // test_string is stored at $0x804a46c; move that pointer into %esp
8048bba: // ???
8048bbb: mov 0x20(%esp),%eax // Moves test_string ptr to %eax
8048bbf: mov %eax,(%esp) // Moves test_string ptr to %esp - not sure why...?
8048bc2: call 8049084 <cmp_strings> // Calls cmp_strings(), probably with %eax and %esp as argument strings
8048bc7: test %eax,%eax // %eax is the returned value
8048bc9: je 8048bd0 <test_string+0x20> // Should we jump to alarm()?
8048bcb: call 804938c <alarm> // If we reach here, I flunk
8048bd0: add $0x1c,%esp // restores %esp to original value
8048bd3: ret // exits
Так что ... если я прав, строка # 2 является важным здесь. Я подозреваю, что строка тайны хранится в памяти адреса $0x804a46c
. Но я не уверен. Отмечу также, что, когда я использую инструмент строк, я вижу это:
[linux]$ strings -t x CODE | grep 46c
246c My dog has fleas.
[linux]$
Это многообещающая ... но не убедительно. Адрес памяти $0x804a46c
не 246c
.
Итак ... извинения за длинный пост, но могут ли люди сказать мне, если я на правильном пути? Любое понимание или мудрость чрезвычайно оценены!
Большое спасибо! -RAO
Используйте 'objdump', чтобы увидеть строку по указанному адресу. 'strings' дает вам смещения файлов, а не виртуальные адреса. Разумеется, вы также можете перевести их, если посмотреть на заголовки разделов, снова используя 'objdump'. – Jester
«Код операции тайны» по адресу '8048bba' является лишь частью предыдущей инструкции. Вероятно, он был включен в следующую строку, потому что кодировка команд настолько длинная. Обратите внимание, что значение в инструкции равно '0x804a46c', а' 6c' 'a4' и' 04' все указаны в предыдущей строке. – davmac
@ davmac: yup, точно вправо. Обычно я использую 'objdump -drwC', чтобы избежать этого (' -w' означает «широкий» и помещает все байты для инструкции в той же строке, независимо от ширины столбца). –