【问题标题】:syscall use in shellcode系统调用在 shellcode 中的使用
【发布时间】:2018-10-01 18:32:44
【问题描述】:

我正在学习汇编,我编写了这个 shellcode,它应该可以在 Firefox 上打开 Google 主页。但是它什么也没做(甚至由于添加了我不明白的指令add %al,(%rax)而导致最后的段错误),我做对了吗?实际上,我什至不确定我是否正确编码了字符串。谢谢!

global _start

_start:
xor rax, rax
push rax

;https:////www.google.com
push 0x6d6f632e656c676f
push 0x6f672e7777772f2f
push 0x2f2f3a7370747468

mov rcx, rsp

push 0x786f66657269662f ; /firefox
push 0x6e69622f7273752f ; /usr/bin

mov rdi, rsp

push rax
push    rcx
push    rdi
mov     rsi, rsp

; execve
mov     al, 0x3b
syscall

我使用以下代码测试我的代码:

char code[] = \x48\x31\xc0\x50\x68\x6f\x67\x6c\x65\x68\x2f\x2f\x77\x77\x68\x68\x74\x74\x70\x48\x89\xe1\x68\x2f\x66\x69\x72\x68\x2f\x75\x73\x72\x48\x89\xe7\x50\x51\x57\x48\x89\xe6\xb0\x3b\x0f\x05
int main(int argc, char **argv){
   (*(void(*)()) code)();
   return 0;
}`

【问题讨论】:

  • 你确定推送是正确的吗?就我而言,amd64 程序集中没有push imm64
  • add %al,(%rax)00 00 的解码方式。这意味着执行超出了您的代码进入填充。这也意味着您没有使用 GDB 的 set disassembly-flavor intel 来匹配您的 NASM 代码。顺便说一句,@fuz 是正确的,没有push imm64。这段代码注定要失败;您应该从 NASM 收到关于截断值太大而无法容纳的警告:How to push a 64bit int in NASM?
  • 你是对的,我改变了代码通过一个寄存器来完成所有的“推送”

标签: assembly x86-64 shellcode


【解决方案1】:

您错过了 firefox 路径上的空终止符。在 firefox 十六进制之前添加 push rax,就像使用 google.com 一样。

另外,为了确保不会因为缺少envp 变量(即随机的rdx)而崩溃,请在构造rsi 时添加此行

...
push    rax
mov     rdx, rsp # Add this to set rdx = [null]
push    rcx
...

这会将一个空数组通过rdx 寄存器传递给envp

最后:通常push rax 是一种破解空值和换行符阻止字符串输入的方法。如果您只是在自己的 c 代码中调用它,您可以使用 push 0 而不是 push rax 并忘记最上面的一行 xor(使用 mov rax, 0x3b 进行系统调用)。您可以保持原样。这只是一个注释。

【讨论】:

  • 非常感谢!是的,我刚刚发现问题是由于随机 rdx 造成的,它现在正在工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多