Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解释strace输出_C_Reverse Engineering_Strace - Fatal编程技术网

解释strace输出

解释strace输出,c,reverse-engineering,strace,C,Reverse Engineering,Strace,使用strace可以看到针对特定文件描述符和特定命令的ioctl调用。第三个参数是一个结构,但strace将其显示为指向内存的原始指针。 strace输出示例: open("/dev/node", O_RDWR) = 3 ioctl(3, 0x108, 0x8f0eb18) = 0 close(3) 是否有办法(strace选项或其他工具)查看原始指针后面的结构或至少一个值?在gdb中,如果您在调用ioctl之前停止它,则可以输入: (gdb) p *(ioctl_struct *) 0x

使用strace可以看到针对特定文件描述符和特定命令的ioctl调用。第三个参数是一个结构,但strace将其显示为指向内存的原始指针。 strace输出示例:

open("/dev/node", O_RDWR) = 3
ioctl(3, 0x108, 0x8f0eb18) = 0
close(3)  

是否有办法(strace选项或其他工具)查看原始指针后面的结构或至少一个值?

在gdb中,如果您在调用ioctl之前停止它,则可以输入:

(gdb) p *(ioctl_struct *) 0x8f0eb18

这将向您展示该内存位置的内容如何映射到ioctl_结构。

我遇到了一个类似的问题:想检查
vde_switch
(它创建了一个TUN/TAP虚拟网络接口)对
ioctl
的系统调用,以便知道我在代码中做错了什么(它必须做与
vde_开关
相同的事情,但需要编程。)

通过运行:

sudo strace vde_switch -tap tap0
作为Terry Greentail,我能够知道正在进行的系统调用是
ioctl(5,TUNSETIFF,0x7fffa99404e0)
,指针将是对
struct ifreq
类型结构的引用。在我的代码中,我有类似于
ioctl(tapfd,TUNSETIFF,&ifr\u dev)

最初,我试图在系统调用时使gdb停止,设置:
catch syscall ioctl
(我曾以
gdb-args vde_switch-tap tap0
)运行gdb,但每当捕获被命中时,gdb都不会显示有关
ioctl
参数的信息。在挣扎了一段时间后,我决定在gdb内部运行strace,如下所示:

gdb --args strace vde_witch -tap -tap0
虽然没有断点以这种方式工作,但输出显示了正在使用的文件描述符:

open("/dev/net/tun", O_RDWR)            = 9
ioctl(9, TUNSETIFF, 0x7fffffffe350)     = 0
所以我又试了一次:
gdb--args strace vde_witch-tap-tap0
并设置了一个条件断点:

b ioctl if $rdi==9
调用约定(我使用的是AMD64)对第一个参数使用
RDI
,对第二个参数使用
RSI
,对第三个参数使用
RDX
(请参阅)。最后,当遇到断点时,我能够检查
ifreq
结构:

Breakpoint 6, ioctl () at ../sysdeps/unix/syscall-template.S:81
81      ../sysdeps/unix/syscall-template.S: File or directory not found.

(gdb) p (struct ifreq) *$rdx
$5 = {ifr_ifrn = {ifrn_name = "tap0", '\000' <repete 11 vezes>}, ifr_ifru = {ifru_addr = {sa_family = 4098, sa_data = '\000' <repete 13 vezes>}, ifru_dstaddr = {sa_family = 4098, sa_data = '\000' <repete 13 vezes>}, ifru_broadaddr = {sa_family = 4098, sa_data = '\000' <repete 13 vezes>}, ifru_netmask = {sa_family = 4098, sa_data = '\000' <repete 13 vezes>}, ifru_hwaddr = {sa_family = 4098, sa_data = '\000' <repete 13 vezes>}, ifru_flags = 4098, ifru_ivalue = 4098, ifru_mtu = 4098, ifru_map = {mem_start = 4098, mem_end = 0, base_addr = 0, irq = 0 '\000', dma = 0 '\000', port = 0 '\000'}, ifru_slave = "\002\020", '\000' <repete 13 vezes>, ifru_newname = "\002\020", '\000' <repete 13 vezes>, ifru_data = 0x1002 <Address 0x1002 out of bounds>}}
断点6,ioctl()位于../sysdeps/unix/syscall template.S:81 81../sysdeps/unix/syscall template.S:找不到文件或目录。 (gdb)p(结构ifreq)*$rdx $5={ifr\u ifrn={ifr\u name=“tap0”,'\000'},ifr\u ifru={ifru\u addr={sau family=4098,sau data='\000'},ifru\u dstaddr={sau family=4098,sau data='\000'},ifru broaddr={sau family=4098,sau data='\000'},ifru netmask={sau family=4098,sau data=\ddru family=4098,sau=4000'',ifru_flags=4098,ifru_ivalue=4098,ifru_mtu=4098,ifru_map={mem_start=4098,mem_end=0,base_addr=0,irq=0'\000',dma=0'\000',port=0'\000',ifru slave=“\002\020”,“'\000',ifru newname=“\002\020”,“'\000',ifru data=0x1002}
它会给你指令的地址吗?如果是这样的话,在GDB中添加一个断点然后查看内存真的很简单…你如何确定实际的结构我不太确定。我的意思是,如果我在我的程序中编写它,它会像这样:
ioctl(dev_node,ioctl_code,&ioctl_struct)
,其中第三个参数是Ioctl_Buf_Struct类型的结构。当我们在上面的示例中看到二进制程序使用strace时,我很想知道0x8f0eb18地址后面是什么:发送到那里的结构是什么,或者至少它的值是什么。gdb能在这里提供帮助吗?嗯……如果您运行该程序,请在之前停止使用该命令,然后可以通过取消引用指针来查找值。使用strace查找所有malloc调用,直到找到返回该指针的调用为止。这将告诉您结构的大小。然后,您可以查看已知大小的内存,从而以二进制形式重现结构。您可能永远不知道该结构是什么,但您可以找到值。