Передача параметров в сборке - PullRequest
0 голосов
/ 24 мая 2018

У меня есть вопрос, по которому мне нужна помощь.Я должен определить пароль (ответ) на эту проблему, который является одним из параметров в сборке.

Вывод:

На этом уровне вам нужно будет использовать gdb, чтобы найтипароль в том виде, как он передается в качестве параметра функции с 6 параметрами.Для x86-64 мнемоника для передачи параметров с помощью регистров - это Silk Dress Diane стоимостью $ 89.(rdi rsi rdx rcx r8 r9)

Введите пароль:

Код objdump функции, которую я считаю, имеет 6 параметров -

00000000004006a1 <foo>:
4006a1: 55                  push %rbp
4006a2: 48 89 e5            mov %rsp,%rbp
4006a5: 53                  push %rbx
4006a6: 48 83 ec 48         sub $0x48,%rsp
4006aa: 48 89 7d d8         mov %rdi,-0x28(%rbp)
4006ae: 48 89 75 d0         mov %rsi,-0x30(%rbp)
4006b2: 48 89 55 c8         mov %rdx,-0x38(%rbp)
4006b6: 48 89 4d c0         mov %rcx,-0x40(%rbp)
4006ba: 4c 89 45 b8         mov %r8,-0x48(%rbp)
4006be: 4c 89 4d b0         mov %r9,-0x50(%rbp)
4006c2: c7 45 e4 01 00 00 00 movl $0x1,-0x1c(%rbp)
4006c9: 48 8b 45 c0         mov -0x40(%rbp),%rax
4006cd: 48 89 c7            mov %rax,%rdi
4006d0: e8 5b fe ff ff      callq 400530 <strlen@plt>
4006d5: 89 45 ec            mov %eax,-0x14(%rbp)
4006d8: 8b 45 ec            mov -0x14(%rbp),%eax
4006db: 48 63 d8            movslq %eax,%rbx
4006de: 48 8b 45 b0         mov -0x50(%rbp),%rax
4006e2: 48 89 c7            mov %rax,%rdi
4006e5: e8 46 fe ff ff      callq 400530 <strlen@plt>
4006ea: 48 39 c3            cmp %rax,%rbx
4006ed: 74 07               je 4006f6 <foo+0x55>
4006ef: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%rbp)
4006f6: c7 45 e8 00 00 00 00 movl $0x0,-0x18(%rbp)
4006fd: eb 31               jmp 400730 <foo+0x8f>
4006ff: 8b 45 e8            mov -0x18(%rbp),%eax
400702: 48 63 d0            movslq %eax,%rdx
400705: 48 8b 45 b8         mov -0x48(%rbp),%rax
400709: 48 01 d0            add %rdx,%rax
40070c: 0f b6 10            movzbl (%rax),%edx
40070f: 8b 45 e8            mov -0x18(%rbp),%eax
400712: 48 63 c8            movslq %eax,%rcx
400715: 48 8b 45 b0         mov -0x50(%rbp),%rax
400719: 48 01 c8            add %rcx,%rax
40071c: 0f b6 00            movzbl (%rax),%eax
40071f: 38 c2               cmp %al,%dl
400721: 74 09               je 40072c <foo+0x8b>
400723: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%rbp)
40072a: eb 0c               jmp 400738 <foo+0x97>
40072c: 83 45 e8 01         addl $0x1,-0x18(%rbp)
400730: 8b 45 e8            mov -0x18(%rbp),%eax
400733: 3b 45 ec            cmp -0x14(%rbp),%eax
400736: 7c c7               jl 4006ff <foo+0x5e>
400738: 8b 45 e4            mov -0x1c(%rbp),%eax
40073b: 48 83 c4 48         add $0x48,%rsp
40073f: 5b                  pop %rbx
400740: 5d                  pop %rbp
400741: c3                  retq

Я верю из4006aa до 4006be это параметры.Однако, когда я вводил значения этих регистров один за другим в качестве ответа, он сказал, что это не правильный ответ (например, -0x28).Я попытался ввести ответы в десятичном, шестнадцатеричном и двоичном виде.Я использовал gdb для его отладки и распечатки 6 регистров параметров в функции и использую эти значения, полученные в качестве ответа по отдельности, это тоже не сработало.Я застрял.Могу ли я получить некоторые рекомендации о том, как решить эту проблему?

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

Вот исполняемый файл, который мне дали для этого, если вы, ребята, захотите попробовать его сами, чтобы помочь мне: https://www.mediafire.com/file/uglm044vw87lb11/ParamsRegs

1 Ответ

0 голосов
/ 24 мая 2018

4006e5: callq 400530 <strlen@plt> вызывает функцию для определения длины строки.Он использует то же соглашение о вызовах, что и ваша функция, принимая const char * arg в RDI.Это установлено здесь, из вашей 4-й функции arg:

4006b6: mov %rcx,-0x40(%rbp)
4006c9: mov -0x40(%rbp),%rax
4006cd: mov %rax,%rdi

Эта стандартная библиотечная функция C возвращает размер строки в rax.Ваша функция берет из нее младшие 32 бита и расширяет ее до rbx (предположительно, источник сделал int len = strlen(arg4);):

4006d5: mov %eax,-0x14(%rbp)
4006d8: mov -0x14(%rbp),%eax
4006db: movslq %eax,%rbx

При 4006de до 4006e5 выполняется та же процедураснова с другой строкой, установленной на 4006be: mov %r9,-0x50(%rbp), и после этого второго вызова функция сравнивает длины:

4006ea: cmp %rax,%rbx

я предполагаю, что одна из этих строк - это пароль, который вы ищете, а другаяэто строка, которую вы вводите. Просто приостановите выполнение на 4006a1, напечатайте регистры с info registers, посмотрите на rcx и r9 с x/s <value in rcx/r9>.

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

...