2017 360春秋杯线上 部分Pwn writeup
smallest
这个题Joker湿傅和说有三种解法,我分别学习了其中两种解法。
题目开了NX,
这个题,代码量很少,我们从汇编中就能看懂逻辑。
xor rax ,rax 将rax的值设置为0,之后的将 rax的值作为调用号,即read的调用号为0,读入数据。所以,我们的初步设想就是通过控制rax,修改调用号,调用不同的函数,起初想能不能控制rdx,传入/bin/sh直接起shell,但是,在gadget中,发现了一个致命的问题。
因为代码少得可怜,能找到gadget也少得可怜,大概也只有
1 | mov rsi,rsp |
问题就是,想改变rdi,只能改变rax,但是,rax一变 rdi就会变,这样一来调用号也变了,并不能达到我们的目的。所以我们只能用SROP解决这个问题了。
第一种解法 mprotect
这种做法是Joker师傅教我的 我也是第一次了解这种方法
SROP + mprotect + shellcode
我们通过mprotect,将不可执行的text段,修改为rax,那么我们就可以执行我们的shellcode了。
1 | # -*-coding:utf-8-*- |
第二种解法 infoleak
通过构造rax,修改为write的调用号,我们可以leak出栈地址,随后,我们可以在leak出的栈地址写/bin/sh,之后就可以起shell了。
1 | #!/usr/bin/env python3 |
hiddenlove
这是 Hitcon 2016 babyheab题改的。
https://github.com/ctfs/write-ups-2016/tree/master/hitcon-ctf-2016/pwn/baby-heap-300