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