nc 签到

没啥好说的

64位调用system

https://www.cnblogs.com/nemuzuki/p/17304843.html

在调用system的时候得避免push rbp因为Ubuntu18,18及以上版本的系统要求在调用system函数时栈16字节对齐
还有就是在调用之前ret指令一次,弹出一次栈

call_system参数

system的参数在rdi里面,通过
pop rdi
retn
可以达到把参数压入rdi中

execve

int execve(const char *file,char *const argv[],char *const envp[])

第一个参数用来打开运行的二进制文件
execve会接改变进程的函数内容,这个函数后面的代码全部不执行,转头去执行我们第一个参数指向的二进制代码

1、文件路径为/bin/sh,这个sh其实是个shell程序,如果argv是空(0也可以),那么就会去打开一个shell,所以execve(“/bin/sh”,0,0)是我们最常用的

如果argv不为空那么sh就可以变成变成一个shell脚本解析器

这时候argv应该是这么组成char *argv[]={“/bin/sh”,”flag”,NULL}这样子

如果argv里面的要解析的文件不是shell程序,那么就会把文件内容以报错的形式输出出来

2、文件路径为/bin/cat,这个cat故名思议就是打印文件内容的程序,函数形式为execve(“/bin/cat”,argv,0),argv[]={“/bin/cat”,”flag”,NULL},zhege argv的第二个变量是要打印的文件的名字,这样子就可以把flag文件打印出来了

分析 seccomp

使用seccomp-tools
https://blog.csdn.net/am_03/article/details/119870152

seccomp-tools dump ./ret2orw

┌──(kali㉿kali)-[~/pm/isctf/ret2orw]
└─$ seccomp-tools dump ./ret2orw 
 line  CODE  JT   JF      K
=================================
 0000: 0x20 0x00 0x00 0x00000004  A = arch
 0001: 0x15 0x00 0x05 0xc000003e  if (A != ARCH_X86_64) goto 0007
 0002: 0x20 0x00 0x00 0x00000000  A = sys_number
 0003: 0x35 0x00 0x01 0x40000000  if (A < 0x40000000) goto 0005
 0004: 0x15 0x00 0x02 0xffffffff  if (A != 0xffffffff) goto 0007
 0005: 0x15 0x01 0x00 0x0000003b  if (A == execve) goto 0007
 0006: 0x06 0x00 0x00 0x7fff0000  return ALLOW
 0007: 0x06 0x00 0x00 0x00000000  return KILL

一个好奇的人