知识杂项

  • 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()函数的任务也就完成了。
  • 本地连接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 基础知识积累的更多相关文章

  1. pwn学习日记Day5 基础知识积累

    知识杂项 int mprotect(const void *start, size_t len, int prot); mprotect()函数把自start开始的.长度为len的内存区的保护属性修改 ...

  2. pwn学习日记Day3 基础知识积累

    知识杂项 msfVENOM:Msfvenom是msf框架配套的攻击载荷生成器. payload:有效载荷. payload:目标系统上渗透成功后执行的代码. Metasploit:一款开源的安全漏洞检 ...

  3. pwn学习日记Day9 基础知识积累

    知识杂项 libc是Linux下的ANSI C的函数库. LOOKUP函数 数组形式:公式为= LOOKUP(lookup_value,array) 式中 array-包含文本.数字或逻辑值的单元格区 ...

  4. pwn学习日记Day8 基础知识积累

    知识杂项 aslr:是一种针对缓冲区溢出的安全保护技术,通过对堆.栈.共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术 ...

  5. pwn学习日记Day6 基础知识积累

    知识杂项 ELF:在计算机科学中,是一种用于二进制文件.可执行文件.目标代码.共享库和核心转储格式文件. char fgets(char buf, int bufsize, FILE stream); ...

  6. pwn学习日记Day2 基础知识积累

    知识杂项 shell-storm.org的shellcode数据库 使用pwntools库把shellcode作为输入传递给程序,尝试使用io.interactive()与程序进行交互,发现可以执行s ...

  7. pwn学习日记Day1 基础知识积累

    ida / od 窗口(针对od操作) 反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址.HEX 数据.反汇编.注释可以通过在窗口中右击出现的菜单 界面选项->隐藏标题 或 显示标题 来进 ...

  8. pwn学习日记Day4 基础知识积累

    知识杂项 *:字符串重复 空指令NOP:\x90 cmp:是比较指令,cmp的功能相当于减法指令.它不保存结果,只是影响相应的标志位. xor:将两个操作数进行异或运算,并将结果存放到操作数1中. s ...

  9. 如何学习FPGA?FPGA学习必备的基础知识

    如何学习FPGA?FPGA学习必备的基础知识 时间:2013-08-12 来源:eepw 作者: 关键字:FPGA   基础知识       FPGA已成为现今的技术热点之一,无论学生还是工程师都希望 ...

随机推荐

  1. Python练习_函数进阶_day10

    1. 1.作业 1,写函数,接收n个数字,求这些参数数字的和.(动态传参) 2,读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么? a=10 b=20 def test5(a,b): p ...

  2. tf 2.0

    tf.function和Autograph使用指南-Part 1 "Keras之父发声:TF 2.0 + Keras 深度学习必知的12件事" Effective TensorFl ...

  3. 使用帅气的cordic算法进行坐标系互转及log10的求解

    参考博客 https://blog.csdn.net/u010712012/article/details/77755567 https://blog.csdn.net/Reborn_Lee/arti ...

  4. 逐步探究ObjC的Weak技术底层

    前言 之前的文章有说过 Atomic 原子操作的原理,其作为一个特殊的修饰前缀,影响了存取操作. 在属性修饰定义中,还有另一类修饰前缀,他们分别是 strong weak assign copy,这些 ...

  5. tesseract图像识别验证码:安装使用和避免坑

    安装使用 https://blog.csdn.net/kk185800961/article/details/78747595 避免的坑 http://www.mamicode.com/info-de ...

  6. apidoc 工具的使用

    使用rest framerok时,需要写API接口文档,此时就需要用到 apidoc(个人觉得这个用的比较顺手) 需要安装nodejs,,, windows 下 1 然后验证是否安装成功  node ...

  7. 记录一次OOM排查经历

    我是用了netty搭建了一个UDP接收日志,堆启动配置 Xmx256  Xms256 ,项目刚启动的时候,系统进程占用内存很正常,在250M左右. 长时间运行之后发现,进程占用内存不断增长,远远超过了 ...

  8. LVS介绍及相关配置

    一. LVS概述 LVS是一种工作在四层协议上的负载均衡解决方案,在1998年5月由章文嵩博士创建.目前广泛使用的负载均衡模型主要有: 1)工作在四层协议(LVS):主要用于四层协议上的负载均衡,性能 ...

  9. phpstudy修改端口及网站根目录和访问 localhost 显示目录文件夹

    一.其它选项菜单=>phpStudy设置=>端口常规设置(勾选允许目录列表): 二. Apache http端口:80 网站目录:D:\phpStudy\PHPTutorial\WWW 默 ...

  10. linux实操_shell判断语句

    常用判断条件: (1)两个数的比较 = 字符串的比较 -lt 小于 -le 小于等于 -eq 等于 -gt 大于 -ge 大于等于 -ne 不等于 (2)按照文件权限进行判断 -r 有读的权限 -w ...