Русский / Russian English / Английский

Сейчас на форуме: vasilevradislav, SDK_19 (+4 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Программирование —› Получить адрес возврата из стека
Посл.ответ Сообщение


Ранг: 336.6 (мудрец)
Статус: Участник
born to be evil

Создано: 16 сентября 2017 13:14 · Поправил: ajax New!
Цитата · Личное сообщение · #1

нужен адрес возврата из процедуры. на x64 может быть дофига прологов, в зависимости от наполнения кодом. каждый раз дебажить/дизасмить и смотреть, что изменилось - не гут.
Code:
  1. Procedure GetStack;
  2. Asm
  3.   push   rax
  4.   mov    rax,[rsp+20h+8+8+8]
  5.   mov    RetAddr,rax
  6.   pop    rax
  7. End;
  8.  
  9. Procedure AAA;
  10. Begin
  11. GetStack;
  12. ...
  13. End;

процедур типа AAA может быть очень много. все с разными параметрами. прежде, чем отвечать, вдумайтесь всякие StackBackTrace и т.п. не применимы




Ранг: 270.9 (наставник)
Статус: Участник
RBC

Создано: 16 сентября 2017 13:44 · Поправил: Kindly New!
Цитата · Личное сообщение · #2

а почему сохранять во временную rax? когда-то под x86 писал примитивнейший код, с записью адреса возврата в свою секцию или в область с атрибутом записи

Code:
  1. ; ESP TRICK START
  2. MOV DWORD PTR DS:[svoya_yachejka_1],ESP
  3. MOV DWORD PTR DS:[svoya_yachejka_2],EAX
  4. MOV EAX,DWORD PTR DS:[ESP]
  5. MOV DWORD PTR DS:[svoya_yachejka_1],EAX
  6. MOV EAX,DWORD PTR DS:[svoya_yachejka_2]
  7. ADD ESP,4         
  8.  
  9. ;PATCH CODE HERE
  10.  
  11. ; ESP TRICK END
  12. MOV DWORD PTR DS:[svoya_yachejka_2],EAX
  13. MOV EAX,DWORD PTR DS:[svoya_yachejka_1]
  14. MOV DWORD PTR DS:[ESP-4],EAX
  15. MOV EAX,DWORD PTR DS:[svoya_yachejka_2]
  16. ADD ESP,-4

если задача
ajax пишет:
нужен адрес возврата из процедуры.

то вполне можно финтить и возвращаться по сохраненному адресу.




Ранг: 336.6 (мудрец)
Статус: Участник
born to be evil

Создано: 16 сентября 2017 13:53 · Поправил: ajax New!
Цитата · Личное сообщение · #3

потому что, есть разнообразие, компилер же генерит
Code:
  1. 4F0730                 push    rbx
  2. 4F0731                 sub     rsp, 20h
  3. 4F0735                 mov     rbx, rcx
  4. 4F0738                 call    GetStack
  5. ...
  6. 4F0770                 push    r13
  7. 4F0772                 push    rdi
  8. 4F0773                 push    rsi
  9. 4F0774                 push    rbx
  10. 4F0775                 sub     rsp, 38h
  11. 4F0779                 mov     rbx, rcx
  12. 4F077C                 mov     esi, edx
  13. 4F077E                 mov     edi, r8d
  14. 4F0781                 mov     r13, r9
  15. 4F0784                 call    GetStack

это не x86, в чем и нюанс




Ранг: 1047.5 (!!!!)
Статус: Участник

Создано: 16 сентября 2017 15:08 New!
Цитата · Личное сообщение · #4

жаль что не msvc
там вроде есть
https://msdn.microsoft.com/en-us/library/s975zw7k.aspx




Ранг: 331.5 (мудрец)
Статус: Участник

Создано: 16 сентября 2017 15:20 New!
Цитата · Личное сообщение · #5

ajax

А зачем вам адрес возврата ?

Просканить стек и найти указатель на процедурное ветвление очевидно.



Ранг: 422.7 (мудрец)
Статус: Участник

Создано: 16 сентября 2017 16:44 · Поправил: dosprog New!
Цитата · Личное сообщение · #6

ajax пишет:
процедур типа AAA может быть очень много. все с разными параметрами.


.. и с разным количеством локальных переменных..




Ранг: 52.0 (постоянный)
Статус: Участник

Создано: 16 сентября 2017 16:55 · Поправил: UniSoft New!
Цитата · Личное сообщение · #7

А такое не подойдет?
Code:
  1. procedure TForm1.btn1Click(Sender: TObject);
  2. var
  3.   p: Pointer;
  4. begin
  5.   p := ReturnAddress;
  6.   edt1.Text := Format('%p', [p]);
  7. end;


delphi не юзаю...
а в msvc есть функция _ReturnAddress();



Ранг: 71.2 (постоянный)
Статус: Участник

Создано: 16 сентября 2017 17:32 New!
Цитата · Личное сообщение · #8

Сделать на каждую процедуру ассемблерную обертку, чтобы сохраняла адрес возврата в TLS.



Ранг: 58.0 (постоянный)
Статус: Участник

Создано: 16 сентября 2017 20:46 New!
Цитата · Личное сообщение · #9

Ты какую проблему-то решить хочешь?




Ранг: 331.5 (мудрец)
Статус: Участник

Создано: 16 сентября 2017 23:38 New!
Цитата · Личное сообщение · #10

kunix

Замена адреса возврата и сохранение его в локальном хранилище - это техника виксов(маршрутизация) и не совместима с защитой, особенно на 64.

Вопрос в том, зачем нужно получать адрес возврата ?




Ранг: 336.6 (мудрец)
Статус: Участник
born to be evil

Создано: 17 сентября 2017 09:55 New!
Цитата · Личное сообщение · #11

все вышеприведенное не катит. повторю, это x64. клерк - хочу знать, какая из процедур вызвала мою




Ранг: 52.0 (постоянный)
Статус: Участник

Создано: 17 сентября 2017 10:41 · Поправил: UniSoft New!
Цитата · Личное сообщение · #12

ajax
Так а все-таки чем же не подходит встроенная интринсик функция ReturnAddress?
она прекрасно справляется и в x64... активно юзается в том-же system.pas
Все же компилятору то лучше знать, где лежит адрес возврата.

ну или как альтернатива: AddressOfReturnAddress, в случае если нужен именно адрес где лежит адрес возврата.

http://chuacw.ath.cx/blogs/chuacw/archive/2014/05/30/undocumented-delphi-routines.aspx

| Сообщение посчитали полезным: ajax, Gideon Vi



Ранг: 563.2 (!)
Статус: Участник
оптимист

Создано: 17 сентября 2017 10:48 New!
Цитата · Личное сообщение · #13

ajax пишет:
какая из процедур вызвала мою

Вопрос процедуры вызывающие вашу, всё ваша программа, или могут вашу процедуру использовать другие программы?




Ранг: 1047.5 (!!!!)
Статус: Участник

Создано: 17 сентября 2017 11:20 New!
Цитата · Личное сообщение · #14

ну можно поизвращаться, а что там в делфи макросы есть ?
можно нашлепать равного кода где

push some_magic_valN;
callfunc();
pop;

а в callfunc() поискать по стеку и найти пред последнее значение перед some_magic_valN

если так неугодны документированы способы))




Ранг: 336.6 (мудрец)
Статус: Участник
born to be evil

Создано: 17 сентября 2017 11:34 · Поправил: ajax New!
Цитата · Личное сообщение · #15

UniSoft офигеть, катит!
ClockMan все мое


 eXeL@B —› Программирование —› Получить адрес возврата из стека
Эта тема закрыта. Ответы больше не принимаются.

Видеокурс ВЗЛОМ