欢迎光临
我们一直在努力

buuctf-pwn ciscn_2019_es_2题解(学习过程持续更新)

本人也是在自学过程,主要目的也是记录学习过程,有些地方做的不太好,都是按照自己理解进行讲解的(不专业),欢迎大家指出问题

这是我做的第一个栈迁移的题,在和AI畅聊三小时后也终于是把这道题做出来了,我会尽量把我在做题过程中遇到的问题讲清楚,欢迎师傅们能给出更好的讲解

此处我将文件命名为pwn_es2

checksec pwn_es2 查看一下保护机制

可以看到这是一个32-bit的文件,并且只有NX保护开启了

将文件拖入ida,按F5将汇编代码转换成c语言代码,得到

思路:这个题有system函数,没有/bin/sh,所以需要我们自己构造字符串传入system,获得shell。但是这个题的s距离ebp偏移0x28字节,read单次最多能读入0x30字节,仅多出0x30-0x28=0x8字节溢出空间,也就是说只能刚刚好覆盖到return address,不能再在后面拼接完整ROP链。而且这个题我们没有途径调用read将字符串写进bss段,所以我们需要在缓冲区s内部提前拼接ROP链与“/bin/sh”,然后填充垃圾数据至ebp,最后将ebp改写成s的起始地址,将返回地址填充leave;ret,依靠栈迁移将指针切换至缓冲区,执行system。

回到虚拟机

ROPgadget –binary pwn_es2 –only "leave|ret"

得到leave_ret = 0x8048562

gdb pwn_es2

b *0x80485b9 (第一个read的地址)

r

n

AAAAAAAA

stack 24

可以看到我们写入AAAAAAAA的地址是0xffffcf00,ebp的地址是0xffffcf38,所以s距离ebp偏移0x38。为了得到s的地址我们还需要知道ebp的地址,而ebp的地址我们可以通过printf给我们打印出来

q

nano exp.py 开始写攻击脚本

payload中,b'a'*0x27+b'b'刚好填充到ebp,我们发送这个payload,然后接收到我们输入的‘b',接下来再接收4个字节就是ebp的地址了(printf输出遇到\\x00才会停止),得到ebp的地址,然后用我们上面得到的s距离ebp偏移地址0x38,就可以计算s的地址了

现在我们来看看payload2的第一行,(1)b'aaaa'用于供给leave指令里的pop ebp读取消耗,防止它吞掉system地址导致跳转崩溃。详细来说就是,pop ebp读取前4字节aaaa填充ebp(垃圾数据),esp会自动加4,正好指向system_plt,rer再弹出system_plt到eip,正常调用system,如果没有这四个a,esp自动加4后会指向后面的0x1,ret会把0x1当成跳转地址,访问非法内存地址。(2)p32(1)这个是用来当作system执行后的返回地址,没有任何实际作用,我们也可以写成p32(0xdeadbeef)或者其他一些什么,只要占够4字节就行。(3)p32(s_addr + 0x10)是我们后面写入的b’/bin/sh‘的地址,b'aaaa'占4字节、每个p32()占4字节,总共16字节也就是0x10。

payload2的第二行,用来填充我们后面的垃圾数据至ebp。

payload2的第三行,将ebp改写成s的起始地址,返回地址覆盖成leave;ret

(我就写到这里吧,有问题可以来问问我,在我的能力范围内我会很乐意为大家解答的,咱们一起进步)

保存退出

python3 exp.py

cat flag

得到flag

CTF2{b23db38d-051e-495f-960e-1f045e4d9256}

此题完

赞(0)
未经允许不得转载:171主机测评 » buuctf-pwn ciscn_2019_es_2题解(学习过程持续更新)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址