了解来自程序集的 ioctl 调用
understanding of ioctl call from assembly
以下代码是linkhttp://dune.scs.stanford.edu/中的程序的一部分。 I/we am/are 无法理解其 dune.S 文件的具体内容。我希望这篇文章调用 DUNE_ENTER 定义为
的 ioctl 命令
#define DUNE_ENTER _IOR(DUNE_MINOR, 0x01, struct dune_config)
我说得对吗?
.globl __dune_enter
__dune_enter://called in entry.c::do_dune_enter
pushfq
subq $REG_END, %rsp
SAVE_REGS 1, 0
SAVE_REST
movq %rsp, DUNE_CFG_RSP(%rsi)
movq %rsi, %rdx
movq [=10=]x8020e901, %rsi /* XXX DUNE_ENTER */ //me: how does he in advance knows the address of dune_enter
movq , %rax /* __NR_ioctl */
syscall //me:is instruction just like sysenter or int 80 for x86_64
cmpq [=10=], %rax
jnz __dune_ret
movq DUNE_CFG_RET(%rdx), %rdi
movq , %rax /* __NR_exit */
syscall
.globl __dune_ret
__dune_ret:
RESTORE_REST
RESTORE_REGS 1, 0
addq $REG_END, %rsp
popfq
retq
任何评论或帮助,即使您觉得简单并且已经理解,我们也将不胜感激
[=12=]x8020e901
不是任何地址。它是关于类型、函数、方向和参数大小的编码信息。它是由 _IOR
宏通过其他宏创建的:
#define _IOC_NRBITS 8
#define _IOC_TYPEBITS 8
/*
* Let any architecture override either of the following before
* including this file.
*/
#ifndef _IOC_SIZEBITS
# define _IOC_SIZEBITS 14
#endif
#ifndef _IOC_DIRBITS
# define _IOC_DIRBITS 2
#endif
#define _IOC_NRSHIFT 0
#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
#ifndef _IOC_READ
# define _IOC_READ 2U
#endif
#define _IOC(dir,type,nr,size) \
(((dir) << _IOC_DIRSHIFT) | \
((type) << _IOC_TYPESHIFT) | \
((nr) << _IOC_NRSHIFT) | \
((size) << _IOC_SIZESHIFT))
#define _IOR(type,nr,size)
_IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
所以这一切默认归结为:
Bits
0- 7 function number
8-15 type
16-29 size
30-31 direction
逆向工程我们可以看到 DUNE_MINOR
是 0xe9
而 sizeof(struct dune_config)
应该是 0x20
.
以下代码是linkhttp://dune.scs.stanford.edu/中的程序的一部分。 I/we am/are 无法理解其 dune.S 文件的具体内容。我希望这篇文章调用 DUNE_ENTER 定义为
的 ioctl 命令#define DUNE_ENTER _IOR(DUNE_MINOR, 0x01, struct dune_config)
我说得对吗?
.globl __dune_enter
__dune_enter://called in entry.c::do_dune_enter
pushfq
subq $REG_END, %rsp
SAVE_REGS 1, 0
SAVE_REST
movq %rsp, DUNE_CFG_RSP(%rsi)
movq %rsi, %rdx
movq [=10=]x8020e901, %rsi /* XXX DUNE_ENTER */ //me: how does he in advance knows the address of dune_enter
movq , %rax /* __NR_ioctl */
syscall //me:is instruction just like sysenter or int 80 for x86_64
cmpq [=10=], %rax
jnz __dune_ret
movq DUNE_CFG_RET(%rdx), %rdi
movq , %rax /* __NR_exit */
syscall
.globl __dune_ret
__dune_ret:
RESTORE_REST
RESTORE_REGS 1, 0
addq $REG_END, %rsp
popfq
retq
任何评论或帮助,即使您觉得简单并且已经理解,我们也将不胜感激
[=12=]x8020e901
不是任何地址。它是关于类型、函数、方向和参数大小的编码信息。它是由 _IOR
宏通过其他宏创建的:
#define _IOC_NRBITS 8
#define _IOC_TYPEBITS 8
/*
* Let any architecture override either of the following before
* including this file.
*/
#ifndef _IOC_SIZEBITS
# define _IOC_SIZEBITS 14
#endif
#ifndef _IOC_DIRBITS
# define _IOC_DIRBITS 2
#endif
#define _IOC_NRSHIFT 0
#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS)
#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS)
#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS)
#ifndef _IOC_READ
# define _IOC_READ 2U
#endif
#define _IOC(dir,type,nr,size) \
(((dir) << _IOC_DIRSHIFT) | \
((type) << _IOC_TYPESHIFT) | \
((nr) << _IOC_NRSHIFT) | \
((size) << _IOC_SIZESHIFT))
#define _IOR(type,nr,size)
_IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
所以这一切默认归结为:
Bits
0- 7 function number
8-15 type
16-29 size
30-31 direction
逆向工程我们可以看到 DUNE_MINOR
是 0xe9
而 sizeof(struct dune_config)
应该是 0x20
.