ciscn_2019_s_3
拿到题目例行检查

64位程序开启了nx保护,将程序放入ida

看到没有system函数第一时间想到的就是泄露libc来做,后来才知道是我学识尚浅,需要用execve函数来做
进入main发现跳转到vuln,于是在进入vuln查看

定义了0x10可以写入0x400读取0x30,有明显的栈溢出
进入gadgets查看

经过网上的查询 mov rax,3bh是sys_execve系统调用,所以我们可以用execve(/bin/sh,0,0)获取shell
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
要使用execve函数,我们需要让rdi=/bin/sh rdx=0 rsi=0
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
首先我们先获得/bin/sh的地址:
程序中没有/bin/sh,我们可以通过read写入到栈中,然后获得/bin/sh的地址
在vuln设置断点,输入aaaaaaaabbbbbbbb
通过stack 30查看

可以看到第三行显示了地址距离我们决定在栈中写入/bin/sh的偏移位 0xe0e8-0xdfd0=280
也就是说当获取0x20的数据然后减去280就是栈中我们写入的/bin/sh的地址
然后我们让rdx=0,当我们用ROPgadget搜索时发现没有pop rdx,所以我们需要使用别的方法
我们在ida中找到这里

可以看到mov rdx,r13, 当r13=0的时候rdx也就为0所以我们可以借用这个地址和下面的pop地址
注意:call【r12+rbx*8】当rbx=0的时候就会 跳转到r12的位置,可以跳转到后面的rop继续执行
现在让rdi=/bin/sh

所需要的都已经获得,构造exp

成功获取到flag

结束
参考博客!
[BUUCTF]PWN21——ciscn_2019_s_3 - Angel-Yan - 博客园 (cnblogs.com)
(4条消息) 【pwn】ciscn_2019_s_3_Nothing-CSDN博客_ciscn_2019_s_3

浙公网安备 33010602011771号