我正在尝试一些 CTF 风格的挑战,我必须在 x86_64 中针对 Linux 编写 shellcode。
在后面的挑战中,代码增长了很多。我现在有一大堆字节,我不能直接在 shellcode 中使用。我的想法是加载代码,然后在第一阶段使用 add/sub 等操作它,然后稍后执行解码的指令。
然而,解码并不总是正常工作。大多数情况下,当我尝试使用诸如 之类[rax]
的指针时,运行时读取的内容与由 读取的内容不同gdb
。这是我正在尝试做的事情的简化版本:
decrypt:
cmp byte [rax], 0x66
jae no_change
cmp byte [rax], 0
je no_change
add byte [rax], 0x3f
no_change:
inc [rax]
loop decrypt
这不起作用。通常[rax]
没有正确读取。但是,当我NOP
在no_change
标签前添加一些说明时,它就可以正常工作了。我只是不明白为什么我不能[rax]
用来指向任何位置。