ELF_x64_Nanomites_Introduction

ELF x64 - Nanomites - Introduction

mmap

mmap只是在虚拟内存分配了地址空间,只有在第一次访问虚拟内存的时候才分配物理内存。

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

在虚拟地址空间中为所调用进程创建一个新的映射。开始地址为addr,长度为length
内核在靠近页边界的地方,尝试创建。如果已有映射在此,就不用addr,会返回新地址

The contents of a file mapping (as opposed to an anonymous mapping;
see MAP_ANONYMOUS below), are initialized using length bytes starting
at offset offset in the file (or other object) referred to by the
file descriptor fd.


prot参数描述所需的内存保护

The flags argument determines whether updates to the mapping are
visible to other processes mapping the same region, and whether
updates are carried through to the underlying file.

mmap 在虚拟空间中开辟一段空间,当要读的时候,将文件内容加载进物理内存


memcpy

void * memcpy ( void * destination, const void * source, size_t num );

表示将0x400ac0的141个字节拷贝到新开辟的虚拟空间中0x7ffff7ffb000

0x4008b6: mov rcx,QWORD PTR [rip+0x2007c3] # 0x601080
rcx==0x3148c93148c03148


r2

help x
命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示输出三个单位,u表示按十六进制显示。

gdb-peda$ x/141xb 0x400ac0


fork

pid_t fork(void)
fork系统调用用于创建一个新进程,称为子进程,它与进程(称为系统调用fork的进程)同时运行,此进程称为父进程。创建新的子进程后,两个进程将执行fork()系统调用之后的下一条指令

返回值: 若成功调用一次则返回两个值,子进程返回0父进程返回子进程ID;否则,出错返回-1

这意味着父子进程间不共享这些存储空间


0x4008d1:    call   0x400630 <fork@plt>

调用后返回0, 则当前的子进程


gdb catch 捕获异常

waitpid

作用同于wait,但可指定pid进程清理,可以不阻塞。

pid_t waitpid(pid_t pid,int *status,int options);成功:返回清理掉的子进程ID;失败:-1(无子进程)

  • pid>0 只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。
  • 参数status如果不是一个空指针,则终止进程的终止状态就存放在status所指向的单元。

SAR

SAR 算术右移指令
符号位保持不变

call rax 如果都不跳转,则到这里
0x7ffff7ffb07b: mov al,0x3c
0x7ffff7ffb07d: mov edi,0x0
0x7ffff7ffb082: syscall

没有解出来:tw-1f198::worried: