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 

 

posted @ 2021-07-25 17:32  庄周恋蝶蝶恋花  阅读(859)  评论(1)    收藏  举报