Как собрать стеки из кода сборки? - PullRequest
2 голосов
/ 14 мая 2019

В данный момент я изучаю кибербезопасность, и мы узнали, как создавать стеки из фрагмента кода сборки. Но из-за отсутствия примеров я не уверен в своей идее сделать это.

Вопрос:

Предположим, что пустой стек и что регистр rax изначально равен 1, все остальные 0. Нарисуйте макет стека после завершения следующего кода и отметьте, куда указывает rsp. Примечание: стек растет сверху вниз.

push rax
inc rax
push rax
lea r11, [rip]
push r11
pop rcx
xor rcx, rcx
push rcx
mov rdx, 0xffff0000
push dx
pop r10w
push r10
add rax, 40
push rax

Я знаю, как работают pop, push, inc и т. Д. (Кроме lea Я не уверен в этом).
Я получил следующий результат для стека:

2
0x00 (or 0 not so sure About this)
0x00
0x00
0x00
42

и rsp у входа с 42.

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

1 Ответ

1 голос
/ 16 мая 2019

Нарисуйте макет стека после завершения кода и отметьте, куда указывает rsp.

Вместо того, чтобы пытаться сделать это в своей голове, вы должны написать это подробно:

code                  stack   register changes
--------------------  -----   ----------------
push rax              1

inc  rax                      rax=2
push rax              1
                      2

lea  r11, [rip]               r11=?
push r11              1
                      2
                      ?

pop  rcx              1       rcx=?
                      2

xor  rcx, rcx                 rcx=0
push rcx              1
                      2
                      0

mov  rdx, 0xffff0000          rdx=0xFFFF0000 -> dx=0
push dx               1
                      2
                      0
                      0

pop  r10w             1       r10w=0 -> r10=0
                      2
                      0

push r10              1
                      2
                      0
                      0

add  rax, 40                  rax=42
push rax              1
                      2
                      0
                      0
                     42 <-- RSP points below here
lea r11, [rip]
push r11
pop rcx

и

mov rdx, 0xffff0000
push dx
pop r10w

не имеют реального влияния на окончательный стек.Однако они изменили регистры R10 и R11.

...