2016-05-17 1 views
1

В настоящее время я пытаюсь вызвать эту функцию под названием «super_secret_function», которая определяется за пределами main в файле main.c. Я использую ASM и не могу использовать jmp или call для достижения этой «super_secret_function». Внутри main - это функция, называемая stack_hack, которая является функцией, с которой я могу манипулировать, чтобы изменить адреса, чтобы достичь сверхсекретной функции.Как вызвать функцию в ASM без вызова или перехода?

Использование GDB Я смог определить адреса «super_secret_function» и успешно называть его jmping к нему из функции. Как я могу манипулировать возвращаемым значением указателя, чтобы вернуться к этому адресу?

.globl stack_hack 

stack_hack: 
pushq %rbp  # push the base pointer on the stack 
movq %rsp, %rbp # move the previous stack pointer to the new base poi 

##MyCode 
movq $0x00000000004005b4, %rbp 
jmp *%rbp 
##EndMyCode 

movq %rbp, %rsp # move the stack pointer to the base pointer 
popq %rbp   # pop the base pointer and load it into %rbp 
ret    # pop the instruction pointer into %rip 
+0

Что такое «возвращает значение указателя»? – immibis

+0

Как минимум, 'ret' берет значение из стека и использует его для изменения IP. Как вы можете изменить что-то в стеке, может ли это быть использовано, чтобы взять вас где-то где-то вместо _back from_? Подсказка: на самом деле это не так сложно, как вы думаете. :) – enhzflep

+0

Большое вам спасибо. Я переместил пункт назначения в% rax, и после того, как он выскочил из rbp, я затем нажал% rax на стек и вернулся –

ответ

4

Поскольку это звучит как домашнее задание, я не дам вам точного ответа, но я постараюсь указать вам в правильном направлении.

Вы сказали, что не можете использовать jmp или call, но ret в конце функции также обновляет счетчик программ. Как вы можете повлиять на значение, которое он обновляет счетчиком программ?

+0

TBH Я очень застрял. Я попытался поставить% rbp в% rsp, однако это также привело к ошибке. –

+2

1) Где «ret» в конце функции получает свое значение? 2) Как вы можете повлиять на это? (Подсказка: на ваш первый вопрос ответит первый вопрос.) – duskwuff

+0

Он получает значение rax и помещает его в rip –

1

Примечание собственного примера кода, и это комментарий:

 ret  # pop the instruction pointer into %rip 

, где данные, которые будут заскочили% рип инструкции в отставке?

0

Fixed после загрузки адреса в% бараках, и после того, как выскакивает% ОПБ, прежде чем RET Я оттолкнул% RAX в стек

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