pwn学习日记Day7 基础知识积累
知识杂项
- strncpy(char s1,const char s2,int n);
其中有三个参数分别表示目标字符串s1,源字符串s2,拷贝长度。意思是将s2指向的字符串的前n个长度的字符放到s1指向的字符串中,并将s1原有的前n个字符覆盖。 - sys_execve()
在真正的开始执行系统调用函数之前,系统调用服务程序已经将一些系统调用的函数的参数传递给了相应的寄存器,比如这里的ebx,ecx,edx都分别保存了系统调用的参数,ebx保存的是第一个参数,依次类推(当然最多传递的参数个数不能大于5个),首先这个函数通过ebx获取需要执行的文件的绝对路径。获取到文件名之后他就会调用do_execve()。- do_execve()
ecx,edx寄存器就是传递给可执行文件的参数指针和环境变量参数指针,这里会生成一个记录可执行文件的信息的结构体--struct linux_binprm。
这个结构体记录可执行文件的信息,用于比对可执行文件的格式找到相应的加载函数,如a.out就调用load_aout_binary()函数开始通过 linux_binprm结构体里面的信息准备此程序的执行工作。 - load_aout_binary()
到了这个函数就是要建立新进程了,与过去告别的时候了,它通过调用flush_old_exec()函数来独立门户,准备成为一个独立的进程,比如更新PCB,更新信号处理表,内存等。 - flush_old_exec()
这个函数就专门负责与过去告别,他先调用exec_mmap()函数将内存结构释放,他将从父进程复制过来的(fork())mm_struct下的vm_area_struct全部释放掉,但是如果通过vfork()到此步骤就不需要释放,当然对于vfork()的父进程的mm_struct是不可能为零的,此时就成为了真正的进程,还需要把其从父进程的线程组中脱离出来,这个通过de_thread()实现,此时vfork()之后调用的execve()就成为了一个进程了。虚拟内存反面独立之后就完成了一大步了,这里就是信号的独立了,信号处理表是从父进程复制过来的,而信号处理表指向的信号服务程序有三种方式,他们分别是:忽视此信号,采用默认的方式,采用进程注册的用户处理方法,但是从父进程复制过来的信号处理表指向父进程的用户注册的函数,并不在次进程空间,因此这 里要调用flush_signal_handle()函数来遍历一遍信号处理表将第三种方式的处里信号的方式改为默认的,这里完成了信号的独立。最后就是关闭从父进程复制过来的文件系统,将父进程打开的文件在这里关闭,这里可以保留0,1,2,三个文件不关闭(stdin,stdout,stderr)这里就完全和父进程独立成为了一个真正的进程了,然后就是建立可执行文件和虚拟内存之间的映射, 建成了vm_area_struct结构,将text,data,bss,建立起虚拟映射,同时他还要将在运行main()函数的参数和环境变量建立起映射,这个都在linux_binprm结构中,到了这里execve()函数的任务也就完成了。
- do_execve()
- 本地连接process()、远程连接remote()。对于remote函数可以接url并且指定端口。
- IO模块
- send(data) : 发送数据
- sendline(data) : 发送一行数据,相当于在末尾加\n
- recv(numb=4096, timeout=default) : 给出接收字节数,timeout指定超时
- recvuntil(delims, drop=False) : 接收到delims的pattern
- recvline(keepends=True) : 接收到\n,keepends指定保留\n
- recvall() : 接收到EOF
- recvrepeat(timeout=default) : 接收到EOF或timeout
- interactive() : 与shell交互
- 数据处理:主要是对整数进行打包,就是转换成二进制的形式,比如转换成地址。p32、p64是打包,u32、u64是解包。
- voiddlsym(voidhandle,constcharsymbol)
函数描述:
dlsym(dynamic library symbol)
根据 动态链接库 操作句柄(handle)与符号(symbol),返回符号对应的地址。使用这个函数不但可以获取函数地址,也可以获取变量地址。
handle:由dlopen打开动态链接库后返回的指针;
symbol:要求获取的函数或全局变量的名称。
返回值:
void 指向函数的地址,供调用使用。 - int sprintf( char buffer, const char format, [ argument] … );
参数列表
buffer:char型指针,指向将要写入的字符串的缓冲区。
format:格式化字符串。
[argument]...:可选参数,可以是任何类型的数据。
返回值
返回写入buffer 的字符数,出错则返回-1. 如果 buffer 或 format 是空指针,且不出错而继续,函数将返回-1,并且 errno 会被设置为 EINVAL。sprintf 返回以format为格式argument为内容组成的结果被写入buffer 的字节数,结束字符‘\0’不计入内。即,如果“Hello”被写入空间足够大的buffer后,函数sprintf 返回5,同时buffer的内容将被改变。 strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。
ROP技术
- 如果程序里找不到system函数,我们可以用用ROPGadget --binary pwn5 | grep “int 0x80”找到了一个可用的gadget。
- 我们知道在http://syscalls.kernelgrok.com/ 上可以找到sys_execve调用,同样可以用来开shell,这个系统调用需要设置5个寄存器,其中eax = 11 = 0xb, ebx = &(“/bin/sh”),ecx = edx = edi = 0。
“/bin/sh”我们可以在前面输入到地址固定的全局变量中。接下来我们就要通过ROPgadget搜索pop eax/ebx/ecx/edx/esi; ret了。
内容来源
execve系统调用
CTF常用python库PwnTools的使用学习
i春秋月刊第六期——Linux pwn零基础入门
pwn学习日记Day7 基础知识积累的更多相关文章
- pwn学习日记Day5 基础知识积累
知识杂项 int mprotect(const void *start, size_t len, int prot); mprotect()函数把自start开始的.长度为len的内存区的保护属性修改 ...
- pwn学习日记Day3 基础知识积累
知识杂项 msfVENOM:Msfvenom是msf框架配套的攻击载荷生成器. payload:有效载荷. payload:目标系统上渗透成功后执行的代码. Metasploit:一款开源的安全漏洞检 ...
- pwn学习日记Day9 基础知识积累
知识杂项 libc是Linux下的ANSI C的函数库. LOOKUP函数 数组形式:公式为= LOOKUP(lookup_value,array) 式中 array-包含文本.数字或逻辑值的单元格区 ...
- pwn学习日记Day8 基础知识积累
知识杂项 aslr:是一种针对缓冲区溢出的安全保护技术,通过对堆.栈.共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术 ...
- pwn学习日记Day6 基础知识积累
知识杂项 ELF:在计算机科学中,是一种用于二进制文件.可执行文件.目标代码.共享库和核心转储格式文件. char fgets(char buf, int bufsize, FILE stream); ...
- pwn学习日记Day2 基础知识积累
知识杂项 shell-storm.org的shellcode数据库 使用pwntools库把shellcode作为输入传递给程序,尝试使用io.interactive()与程序进行交互,发现可以执行s ...
- pwn学习日记Day1 基础知识积累
ida / od 窗口(针对od操作) 反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址.HEX 数据.反汇编.注释可以通过在窗口中右击出现的菜单 界面选项->隐藏标题 或 显示标题 来进 ...
- pwn学习日记Day4 基础知识积累
知识杂项 *:字符串重复 空指令NOP:\x90 cmp:是比较指令,cmp的功能相当于减法指令.它不保存结果,只是影响相应的标志位. xor:将两个操作数进行异或运算,并将结果存放到操作数1中. s ...
- 如何学习FPGA?FPGA学习必备的基础知识
如何学习FPGA?FPGA学习必备的基础知识 时间:2013-08-12 来源:eepw 作者: 关键字:FPGA 基础知识 FPGA已成为现今的技术热点之一,无论学生还是工程师都希望 ...
随机推荐
- Java内存模型(JMM)
JVM与线程(线程在JVM中) 1.JVM什么时候启动? 类被调用时启动,此时会启动JVM线程然后再是其他的线程(main) 2.JVM内存区域 除了程序计数器(PC)之外都有可能发生 ...
- apk签名文件生成
一.生成签名文件 命令: keytool -genkey -v -keystore 签名文件名称.keystore -alias 签名文件别名 -keyalg RSA -keysize 2048 -v ...
- sql sever 查询用户所有的表和各个表数据量
和oracle有区别, 需要关联表 SELECT A.NAME ,B.ROWS FROM sysobjects A JOIN sysindexes B ON A.id = B.id WHERE A ...
- Octave基本语法
基本运算 octave:3> 5+6 ans = 11 octave:4> 3-2 ans = 1 octave:5> 8*9 ans = 72 octave:6> 8/4 a ...
- Ubuntu系统---安装“搜狗拼音法”导致桌面打不开
Ubuntu系统---安装“搜狗拼音法”导致桌面打不开 ubuntu系统中文版,安装完后,自带中文输入法.中文用着好好的,用一段时间后,就会莫名的出现,切换不过来,中文输入不好用了.只是简单想装一个搜 ...
- 0002SpringBoot整合Junit
前提条件:SpringBoot已经整合了Mybatis,至于SpringBoot如何整合Mybatis可参考我的上一篇文章 SpringBoot为什么要整合Juni? SpringBoot整合了Jun ...
- PHP 获取上传文件的实际类型
方案一: mime_content_type ( string $filename ) : string (PHP 4 >= 4.3.0, PHP 5, PHP 7) mime_content_ ...
- 实例化Vue时的两种挂载方式el与$mount
el 与mount 都是挂载. el vue官网的介绍https://cn.vuejs.org/v2/api/#el mount vue官网的介绍 https://cn.vuejs.org/v2/ap ...
- JAVA遇见HTML——JSP篇(JSP内置对象上)
action:表单交给哪个动作去处理 MIME类型: 浏览器通常使用MIME类型(而不是文件扩展名)来确定如何处理文档:因此服务器设置正确以将正确的MIME类型附加到响应对象的头部是非常重要的. 语法 ...
- 关于EZDML数据库表结构制作设计工具使用踩的坑
我使用的是一款EZDML的数据库表结构制作设计工具 最开始在数据库创建数据库名为personalmall,基字符集为默认,数据库排序规则也是默认,创建完成之后 去EZDML生成SQL 点击执行sql ...